Swift 4 具有 Post 请求的可编码结构

Swift 4 Codable Struct with Post Request

我想发送一个 url.request(POST),带有这样的 Codable 结构:

struct Picklist : Codable {
    var id = Int()
    var ean = String()
    var position = String()
}

我的要求是这样的:

 let request = NSMutableURLRequest(url: NSURL(string: "http://XXX.XX.XX.XX/NEW/index.php")! as URL)
        request.httpMethod = "POST"



                let myID = Picklist.init(id: 3, ean: "asdf", position: "q")
                let encoder = JSONEncoder()
                do {
                    let jsonData = try encoder.encode(myID)
                    request.httpBody = jsonData
                    print("jsonData: ", String(data: request.httpBody!, encoding: .utf8) ?? "no body data")
                } catch {
                    print("ERROR")
                }

        let task = URLSession.shared.dataTask(with: request as URLRequest) {
            data, response, error in

            if error != nil {
                print("error=\(error)")
                return
            }

            print("response = \(response)")

            let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            print("responseString = \(responseString)")
        }
        task.resume()

在服务器端,我有这个 PHP 脚本:

<?php
    print_r($_POST);
?>

但我收到了:

responseString = Optional(Array
(
    [{"id":3,"ean":"asdf","position":"q"}] => 
)

我的问题是我无法获得具有 PHP 值的密钥..

代码有什么问题?

最后,答案是:

如果您想使用响应字符串,只需去解码 "data"

例如:

guard let data = data else {return}
            do{
                let realData = try JSONDecoder().decode(response.self, from: data)
                completion(realData)
            }catch let jsonErr{
                print(jsonErr)
            }

在 realData 中,您可以使用数据,但您需要创建 Codable/decobale 结构才能使用

响应是我的 coddle/decodable 结构

或:

let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
    if let responseJSON = responseJSON as? [String: Any] {
        print(responseJSON)
    }