Подтвердить что ты не робот

Как определить Content-type в Swift с помощью NSURLSession

Я хочу установить тип контента в моем нижнем коде, чтобы вызвать web api. Контент-тип будет 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()
4b9b3361

Ответ 1

Если вы хотите установить Content-Type запроса, вы можете создать свой собственный URLRequest, указав свой URL, указать заголовок Content-Type используя setValue(_:forHTTPHeaderField:) а затем выполнить запрос с URLRequest вместо URL непосредственно. И просто установите httpBody как JSON и укажите httpMethod для POST:

let url = URL(string: "http:/api/jobmanagement/PlusContactAuthentication")!
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": username, "userPwd": password]
request.httpBody = try! JSONEncoder().encode(dictionary)

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

    // parse response; for example, if JSON, define 'Decodable' struct 'ResponseObject' and then do:
    //
    // do {
    //     let responseObject = try JSONDecoder().decode(ResponseObject.self, from: data)
    //     print(responseObject)
    // } catch let parseError {
    //     print(parseError)
    //     print(String(data: data, encoding: .utf8))   // often the 'data' contains informative description of the nature of the error, so let look at that, too
    // }
}
task.resume()

Для воспроизведения Swift 2 см. Предыдущую редакцию этого ответа.

Ответ 2

Это сработало для меня при разработке приложения для iOS с использованием SWIFT 5 для вызовов API. Метод GET работал без этих двух строк. Методы PUT и POST отправляют значения на сервер API, но как только он достигает сервера, он не может интерпретировать данные JSON, поэтому моя база данных будет вставлять значения NULL для всех полей. После добавления этих двух строк данные были правильно перенесены в таблицы. Надеюсь, это сэкономит кому-то еще время.

 request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")  
 request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")