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().responseJSONAlamofire.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)的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire POST编码问题

在 Alamofire 中使用之前对 URL 进行编码

Alamofire POST 方法不会将值传递给 url

Alamofire 编码无效URL

如何阻止 Alamofire 编码 URL 参数

Moya/Alamofire - 具有相同键的 URL 编码参数