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文件的工具