我正在使用 Swift4 提供的 JSONEncoder。我有一个名为 Customer 的类,它使用 Codable 协议。Customer 内部有四个字符串。
class Customer: Codable {
var title: String
var firstName: String
var lastName: String
var email: String
}
使用 GET 请求读取 JSON 可以正常工作。
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error!.localizedDescription)
}
guard let data = data else { return }
do {
let customer = try JSONDecoder().decode(Customer.self, from: data)
DispatchQueue.main.async {
print("\(customer.title)")
print("\(customer.firstName)")
print("\(customer.lastName)")
print("\(customer.email)")
}
} catch let jsonError {
print(jsonError)
}
}.resume()
但是,当我开始执行 POST 请求时,我迷路了:
首先设置请求对象:
let urlString = "http://localhost:8000/customer"
guard let url = URL(string: urlString) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
let customer = Customer()
customer.title = "Mr"
customer.firstName = "Chuck"
customer.lastName = "Norris"
customer.email = "chuck.norris@awsome.com"
let encodedData = try? JSONEncoder().encode(customer)
print(String(data: encodedData!, encoding: .utf8)!) //<- Looks as intended
// Output is {"firstName":"Chuck","lastName":"Norris","title":"MR","email":"chuck.norris@awesome.com "}
现在发出来
request.httpBody = encodedData //
URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) in
if let response = response {
print(response)
}
if let data = data {
do {
let json = try JSONSerialization.data(withJSONObject: data, options: [])
print(json)
}catch {
print(error)
}
}
})
作为回报,我收到消息“给定的数据不是有效的 JSON”。
所以,我的假设是我不能只是将编码的 JSON 数据放入我的请求的 http 正文中。
浏览一些关于 URLSession 和 JSON 的文章,我发现我似乎需要序列化我的编码 JSON:
var json: Any?
if let data = encodedData {
json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)
}
现在,我不知道如何进行。首先,我不明白为什么我应该将我的 JSON 序列化为不能简单地放入 httpBody 的东西。因为 JSONSerialization.jsonObject 产生 Any? 而不是数据。
现在更新 ,我能够成功地将我的数据发送到我的服务器。我仍在试图了解出了什么问题 - 因为我没有更改任何内容(除了在完成处理程序中删除 JSONSerialization 调用。我将进一步调查......并且 .resume 已经丢失。:-)