Alamofire .POST 编码 (.URL)
Posted
技术标签:
【中文标题】Alamofire .POST 编码 (.URL)【英文标题】:Alamofire .POST encoding (.URL) 【发布时间】:2016-08-10 03:39:12 【问题描述】:所以,我正在尝试使用 Alamofire 使用默认选项发出 .POST
请求:
Alamofire.request(.POST, url, parameters: parameters).validate().responseJSON
这个很好用。正如文档所说,参数的默认编码是.URL
。
现在我正在尝试按照本指南改进我的代码创建路由器: https://grokswift.com/router/
在实现的最后需要手动对参数进行编码。所以,如果默认值有效,我现在在这里使用.URL
编码,如下所示:
let encoding = Alamofire.ParameterEncoding.URL
let (encodedRequest, _) = encoding.encode(urlRequest, parameters: parameters)
现在请求不起作用,因为参数显然是以错误的格式发送的。
我很确定 API 可以正常工作,我正在 Postman 中对其进行测试,并使用 form-data
选项发送参数。
提前感谢任何可以帮助我的人!
【问题讨论】:
也许你可以尝试使用alamofire的multipartFormData
@Tj3n 我想到了这个。但是如果编码方式相同,默认请求中没有multipartFormData
,但在路由器中没有multipartFormData
怎么办?
我对此不太确定:D 也许您可以尝试打印出请求的 HTTPBody 并将其解码回来查看值?
这两个请求之间可能存在一些 HTTP 标头差异。也许您没有在后一种方法中设置 Content-Type
标头?
可以的! @AaronBrager 我不检查这个,过会儿试试!
【参考方案1】:
如果它以前可以工作,请仔细检查它是否使用了 URL 编码:
let postRequest = Alamofire.request(.POST, url, parameters: parameters)
.validate()
.responseJSON ...
debugPrint(postRequest)
这应该会显示您请求的等效 cURL 语句。
然后把路由器改成使用.URL
编码,看看debugPrint
输出有没有变化。
【讨论】:
嘿!我刚试了一下,其实默认是.URL编码。当我使用Alamofire.request default implementation
时,像这样:Alamofire.request(.POST, baseApiAddress, parameters: parameters, encoding: .URL).validate().responseJSON
或Alamofire.request(.POST, baseApiAddress+"/users", parameters: parameters).validate().responseJSON
,请求的工作方式相同,所以实际上是.URL 编码。但是当我像我说的那样尝试做路由器时,.URL 编码不起作用。
哦,调试打印也是一样的!
做了一些挖掘,使用debugPrint
我可以看到默认Alamofire.request
和使用问题中描述的路由器时的标题相同,路由器中的cURL
是缺少-d
语句,参数位于URL
本身。使用默认实现时,参数位于-d
语句中,而不是URL
中。两者都使用.URL
编码选项。对可能发生的事情有任何想法吗?
检查你是否在let (encodedRequest, _) = encoding.encode(urlRequest, parameters: parameters)
之前设置了HTTP方法(.POST)
就是这样!我需要在编码参数之前设置方法...谢谢!!!!【参考方案2】:
根据我在 Swift 和 Objective-C 方面的经验,当我们使用 POST 发出请求时,除非有任何特殊字符或空格,否则不应该要求传递带有编码的 URL。
如果您正在发出 GET 请求,那么您应该始终传递带有编码的 URL。在 POST 中,无论你的参数是什么,都作为表单数据传递给它自己。没有任何代码需要它们。
因此,在您的代码中,只需从 POST 方法中删除 URL 编码部分。
【讨论】:
【参考方案3】:您也可以将参数编码设置为 JSON。
let encoding = Alamofire.ParameterEncoding.JSON
【讨论】:
以上是关于Alamofire .POST 编码 (.URL)的主要内容,如果未能解决你的问题,请参考以下文章