-4

我想快速创建一个发布请求,但我对Encodable协议感到困惑。以及如何创建它们。

以下是我要发布的数据:

{
answers: [{
            "time": 1,
            "score": 20,
            "status": true,
            "answer": 456
 }],
challenge_date": "2019-03-13"  
}

我怎样才能用Encodableor发布它JSONSerialization

4

2 回答 2

0

使用 Alamofire 并将参数作为字典传递encoding: JSONEncoding.default,请参见以下代码。

    Alamofire.request(urlString!, method: .post, parameters: parameter, encoding: JSONEncoding.default, headers: headers)
        .responseJSON { (response) in
            switch response.result {
            case .success:
                print(response)                    
            case .failure(let error):
                print(error.localizedDescription)
            }
    }
于 2019-03-14T06:04:08.710 回答
0

这个 JSON 是错误的。您的 JSON 必须有效。为了使上述 JSON 有效,我们需要使用键设置数组。

错误的

{
 [{
            "time": 1,
            "score": 20,
            "status": true,
            "answer": 456
 }],
challenge_date": "2019-03-13"  
}

正确的

{
    "array": [{
                "time": 1,
                "score": 20,
                "status": true,
                "answer": 456
     }],
    "challenge_date": "2019-03-13"  
}

上面 JSON 的 Swift 模型是这样的。

struct YourJSONModel: Codable {
    var challenge_date: String
    var array: Array<ResultModel>
}
struct ResultModel: Codable {
    var time: Int
    var score: Int
    var status: Bool
    var answer: Int
}

var result = ResultModel()
result.time = 10
result.score = 30
result.status = true
result.answer = 250


var jsonModel = YourJSONModel()
jsonModel.array = [result]
jsonModel.challenge_date = "2019-03-13"

将上述模型转换为 json 数据以发布。使用下面的代码。

let jsonData = try! JSONEncoder().encode(jsonModel)

var request = URLRequest(url: yourApiUrl)
request.httpBody = jsonData
request.httpMethod = "POST"

Alamofire.request(request).responseJSON { (response) in
            switch response.result {
            case .success:
                print(response)                    
            case .failure(let error):
                print(error.localizedDescription)
            }
}
于 2019-03-14T06:29:05.207 回答