HTTP Authentication request with Campaign Monitor in Swift

1.5k Views Asked by At

I am trying to post user data to Campaign Monitor when they sign up in my app. Can anyone help me add the authorisation to the request. I currently get this error:

Optional("{\"Code\":50,\"Message\":\"Must supply a valid HTTP Basic Authorization header\"}")

my code:

let parameters = [  "FirstName1": "test",
                    "SecondName": "test",
                    "email": "[email protected]"
                    ]

let clientID = "52bb93ac4d9a3f261abcda0123456789"
let url = URL(string: "https://api.createsend.com/api/v3.2/clients.json")!
var request = URLRequest(url: url)
request.httpMethod = "Post"

do {
    request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
    print(error.localizedDescription)
}

// add the API Key to the request / security
request.setValue(clientID, forHTTPHeaderField: "username") // IS THIS RIGHT??

// THiS WAS HOW I CREATED CORRECT AUTHORIZATION

let APIKey = "0069b38c27b3e44de0234567891011"
let listID = "5e61fde130969d561dc0234567891011"

    let url = URL(string: "https://api.createsend.com/api/v3.2/subscribers/\(listID).json")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"

    // add the API Key to the request / security
    let loginString = "\(APIKey)"
    let loginData = loginString.data(using: String.Encoding.utf8)
    let base64LoginString = loginData!.base64EncodedString()
    request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

do {
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
    } catch let error {
        print(error.localizedDescription)
    }

// THEN CAN SET UP THE SESSION

let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) {

    (data, response, error) in

    if error != nil {
        print("Error is: \(String(describing: error))")
    }

    if let response = response {
        let nsHTTPResponse = response as! HTTPURLResponse
        let statusCode = nsHTTPResponse.statusCode
        print("status code = \(statusCode)")
    }

    if let data = data {
        let postResponse = String(data: data, encoding: .utf8)
        print("responseString = \(String(describing: postResponse))")
    }

}
task.resume()
1

There are 1 best solutions below

4
excitedmicrobe On

In this line:

// add the API Key to the request / security
request.setValue(clientID, forHTTPHeaderField: "username") // IS THIS RIGHT??

It's not correct, even they told you why. You need a Basic Auth Header

For POST requests in Swift, generally you have to set the following:

request.setValue("Basic " + clientID, forHTTPHeaderField: "Authorization") // is clientID your access token?

Good luck