Alamofire 的格式化字典

Posted

技术标签:

【中文标题】Alamofire 的格式化字典【英文标题】:formatting dictionary for Alamofire 【发布时间】:2016-11-08 14:37:44 【问题描述】:

这个问题更多是关于 Swift & 和字典而不是 Alamofire 本身

我需要通过网络服务创建记录,并且我正在使用 Alamofire。出于某种原因,我的报价过多,网络服务拒绝了我的来电

如果我通过 web 服务接收的 curl 模拟调用:

"records"=>["id"=>"2", "node"=>"children"=>["specifications"=>"Specs", "description"=>"Fee", "line_item"=>"sale_price"=>123.4, 
"amount"=>1, "vat_percentage"=>21, "unit_price"=>99.5]], "action"=>"create", "collection"=>"invoices", "controller"=>"api/v2/api"

如果我在我的应用中通过 Alamofire 进行调用,网络服务会收到:

"records"=>["id"=>"2", "node"=>"children"=>["specifications"=>"Specs", "description"=>"Fee", "line_item"=>"sale_price"=>"123.4", 
"amount"=>"1", "vat_percentage"=>"21", "unit_price"=>"99.5"]], "action"=>"create", "collection"=>"invoices", "controller"=>"api/v2/api"

如您所见,每个数字都有自己的引号(例如,“99.5”与 99.5,导致 web 服务翻转。

我进行了调整,但找不到如何在 Swift 中解决此问题。我为 Alamofire 创建有效载荷的方式是:

let jsonObject: [String: AnyObject] = [
            "id": id as AnyObject,
            "node" : [
                "children": [[
                    "description" : lineDescription,
                    "specifications" : lineSpecifications,
                    "line_item" : [
                        "amount" : 1,
                        "unit_price" : feePrice,
                        "sale_price" : feePrice,
                        "vat_percentage" : 21

                    ]
                ]] as AnyObject
            ] as AnyObject
        ]
let parameters = ["records" : [jsonObject as AnyObject]]    

Alamofire.request(urlPath, method: .post, parameters: parameters, headers: ["X-API-KEY": apiKey, "Content-type application":"json", "Accept application" : "json"]).responseString() 

            response in switch (response.result) 

blah blah

其中变量 lineDescription 和 lineSpecifications 是字符串,而 feePrice 是 Double

【问题讨论】:

请发送您在尝试执行 Web 服务时收到的错误消息。 错误信息是:该集合不允许使用方法。这真的没有帮助。因此,我在 web 服务的生产日志(ssh test@site tail -f shared/log/production.log)上做了一个尾巴,我可以看到使用 Curl 它在 int/doubles 周围不带引号发送,在 Swift/Alamofire 带引号发送 对不起,您需要将它们转换成NSNumber,然后尝试发送。 我试过 "line_item" : [ "amount" : 1 as NSNumber, "unit_price" : feePrice as NSNumber, "sale_price" : feePrice as NSNumber, "vat_percentage" : 21 as NSNumber ] 但那没有't 改变结果(仍然有引号) 找到了解决方案!需要在 Alamofire 请求中添加: encoding: JSONEncoding.default 【参考方案1】:

如评论中所述,我需要为请求添加编码。要关闭问题并显示更友好的格式化解决方案,请使用此答案:

Alamofire.request(urlPath, method: .post, parameters: parameters, headers: ["X-API-KEY": apiKey, "Content-type application":"json", "Accept application" : "json"]).responseString() 

应该是:

Alamofire.request(urlPath, method: .post, parameters: parameters,  encoding: JSONEncoding.default, headers: ["X-API-KEY": apiKey, "Content-type application":"json", "Accept application" : "json"]).responseString() 

【讨论】:

此编码还允许您在 ruby​​ on rails 服务器上正确解析 request.raw_post。在这里救了我的命!

以上是关于Alamofire 的格式化字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 3 中使用 Alamofire 制作和发送字典数组(JSON 格式)发送到服务器

Swift - 从字典(或者Alamofire)直接创建Model文件的工具

Alamofire 无法将 NSCFString 类型转换为字典

Alamofire:发送带有字典数组的 JSON

iOS 中的 Alamofire 正在接收字典而不是数组

使用 Alamofire 解析字典中的 json 对象 [关闭]