3

我正在使用 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 已经丢失。:-)

4

0 回答 0