发送 JSON 数组作为参数 Alamofire

Posted

技术标签:

【中文标题】发送 JSON 数组作为参数 Alamofire【英文标题】:Send JSON array as a parameter Alamofire 【发布时间】:2020-04-08 14:57:52 【问题描述】:

我在处理包含使用 Alamofire 的 Json 数组的参数时遇到了困难

这是我的 Json 字符串:

"[\"id\":546836102,\"count\":1,\"id\":216479424,\"count\":1]"

这是我提出请求的代码:

let data = (params["cart"] as! String).data(using: .utf8)!
do 
    if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .fragmentsAllowed) as? [Dictionary<String, Int>] 

       let parameters: Parameters = [
           "address_id": params["address_id"] as! Int,
           "delivery_day": params["delivery_day"] as! String,
           "delivery_hour": params["delivery_hour"] as! Int,
           "cart": jsonArray,
           "via": params["via"] as! String
       ]

       Alamofire.request(Global.baseURL + "orders/finish", method: .post, parameters: parameters, encoding: URLEncoding.default, headers: header)
                .responseSwiftyJSON 

打印出我的parameters

["cart": [["id": 546836102, "count": 1], ["count": 1, "id": 216479424]], "address_id": 641589205, "delivery_day": "1399-01-20", "delivery_hour": 21, "via": "ios"]

后端必须收到cart,如下:

[
 
  "id": 123456,
  "count": 2
 ,
 
  "id": 654321,
  "count": 3
 
]

但它获取的数据是这样的:


 "delivery_hour" : "21",
 "delivery_day" : "1399-01-20",
 "cart" : [
  
   "count" : "1"
  ,
  
   "id" : "546836102"
  ,
  
   "count" : "1"
  ,
  
   "id" : "216479424"
  
 ],
 "via" : "ios",
 "address_id" : "641589205"

我尝试过 Alamofire 的 JSONEncoding 和 URLEncoding 选项,但似乎没有任何效果,这是迄今为止我最接近 API 模板的。

我在这里做错了什么?

// MARK: - Update

所以我更新到最新版本的 Alamofire 仍然没有好的结果:( 代码如下:

let payload = MyParameters(address_id: 641589205, delivery_day: "1399-01-21", delivery_hour: 21, cart: items, via: "ios")

AF.request(url, method: .post, parameters: payload, encoder: JSONParameterEncoder.default, headers: .init(header), interceptor: nil).response  dataResponse in
        switch dataResponse.result 
        case .success(let value):
            if dataResponse.response?.statusCode == 200 
                let json = JSON(value!)
                completionHandler(json, nil)
             else 
                print(dataResponse.response?.statusCode ?? -1)
            
        case .failure(let error):
            print(error)
            completionHandler(nil, error.localizedDescription)
        

我的payload 看起来正是我想要的样子


  "cart" : [
    
      "count" : 1,
      "id" : 546836102
    ,
    
      "count" : 1,
      "id" : 216479424
    
  ],
  "via" : "ios",
  "address_id" : 641589205,
  "delivery_day" : "1399-01-21",
  "delivery_hour" : 21

但是端点又收到了这个:


  "\"delivery_day\":\"1399-01-21\",\"address_id\":641589205,\"delivery_hour\":21,\"cart\":" : 
"\"id\":546836102,\"count\":1,\"id\":216479424,\"count\":1" : null
  

【问题讨论】:

【参考方案1】:

使用 Alamofire 4,您无法使用您显示的方法发送数组,因为 Parameters 类型是 [String: Any]。您也没有使用正确的ParameterEncoding。如果要发送 JSON 正文,则需要使用 JSONEncoding。您可以做的是手动将数组序列化为 URLRequest 并使用 Alamofire 发出该请求。

此外,如果您更新到 Alamofire 5,现在支持 Encodable 参数,因此如果您可以将参数定义为 Encodable 类型,发送它们就像传递数组一样简单。

AF.request(..., parameters: [some, encodable, values], encoder: JSONEncoder.default)...

【讨论】:

我已经更新并完成了本教程 (stencia.com/blog/2019/8/18/post-using-alamofire-5),但仍然不是预期的结果。我用新代码更新了我原来的帖子

以上是关于发送 JSON 数组作为参数 Alamofire的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 在 Alamofire 中发送带有对象数组的 JSON 作为参数

AFNetworking 在 GET 请求的 JSON 参数中发送数组

iOS Swift moya框架发送数组作为请求参数(GET/POST)

axios以‘application/json‘方式传递数组Array作为参数

axios以‘application/json‘方式传递数组Array作为参数

使用 Alamofire 请求方法在 POST 的请求正文中发送 JSON 对象数组