dhaval shah dhaval shah - 1 month ago 22
Swift Question

How can I define Content-type in Swift using NSURLSession

I want to set content-type in my below code to call web api.
Content-type will be

application/json; charset=utf-8


let url = NSURL(string: "http:/api/jobmanagement/PlusContactAuthentication?email=\(usr)&userPwd=\(pwdCode)")

println("URL: \(url)")

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {
(data, response, error) in
println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

// task.setValue(<#value: AnyObject?#>, forKey: <#String#>)
task.resume()

Rob Rob
Answer

If you want to set the Content-Type of the request, you can create your own NSMutableURLRequest, supplying your URL, specify the Content-Type header using setValue:forHTTPHeaderField: and then issue the request with dataTaskWithRequest rather than dataTaskWithURL. So, in Swift 2 you can set the request.HTTPBody to be that JSON and specify that it is a POST request:

let request = NSMutableURLRequest(URL: url!)
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")  // the request is JSON
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")        // the expected response is also JSON
request.HTTPMethod = "POST"
request.updateBasicAuthForUser("test", password: "password1")

let dictionary = ["email": usr, "userPwd": pwdCode]
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(dictionary, options: [])

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
    guard let data = data where error == nil else {
        print(error)                                                // some fundamental network error
        return
    }

    do {
        let responseObject = try NSJSONSerialization.JSONObjectWithData(data, options: [])
        print(responseObject)
    } catch let jsonError {
        print(jsonError)
        print(String(data: data, encoding: NSUTF8StringEncoding))   // often the `data` contains informative description of the nature of the error, so let's look at that, too
    }
}
task.resume()

In Swift 3, the equivalent code is:

var request = URLRequest(url: url!)
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")  // the request is JSON
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")        // the expected response is also JSON
request.httpMethod = "POST"

let dictionary = ["email": usr, "userPwd": pwdCode]
request.httpBody = try! JSONSerialization.data(withJSONObject: dictionary)

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        print(error)                                 // some fundamental network error
        return
    }

    do {
        let responseObject = try JSONSerialization.jsonObject(with: data)
        print(responseObject)
    } catch let jsonError {
        print(jsonError)
        print(String(data: data, encoding: .utf8))   // often the `data` contains informative description of the nature of the error, so let's look at that, too
    }
}
task.resume()
Comments