使用 moya 和 alamofire 时使用参数编码发布请求错误

Posted

技术标签:

【中文标题】使用 moya 和 alamofire 时使用参数编码发布请求错误【英文标题】:Post request error with parameter encode when use moya and alamofire 【发布时间】:2017-08-03 11:16:00 【问题描述】:

我使用moya发出post请求,但是当我发送post时,服务器给我一个错误,它无法解码body参数。我使用URLEncoding.default来编码这样的参数

public var parameterEncoding: ParameterEncoding 
    return URLEncoding.default

会设置内容类型application/x-www-form-urlencoded,服务器接受的内容类型也一样

如果parameters是像"a":"b"这样的字典,那效果很好,但是如果字典包含数组或另一个字典,则服务器无法从请求体中获取参数。

前:


   "a":"xxx",
   "b":[
          "xxxxx",
          "xxxxx"
       ]

alamofire 会像这样编码 "a"="xxx"&b[]=xxxx&b[]=xxx

但服务器期望 a=xxx&b[0]=xxx&b[1]=xxxx

如何解决这个问题?

【问题讨论】:

【参考方案1】:

您可以手动构建参数字符串,然后将参数字符串链接到Url字符串。最后,只需通过 Alamofire 使用 url 发出请求,不带任何参数(它们已经在 url 中)。

参数串的构建方式:

    let dict = ["a":"xxx","b":["xxx","xxxxxxx"]] as [String : Any]
    var paramString = ""

    for key in dict.keys 
        let value = dict[key]
        if let stringValue = value as? String 
            paramString += "&\(key)=\(stringValue)"
        
        else if let arr = value as? Array<String> 
            for i in 0 ... arr.count - 1 
                paramString += "&\(key)[\(i)]=\(arr[i])"
            
        
        else
            //other type?
        
    

    if paramString.characters.count > 0 
        paramString = paramString.substring(from: paramString.index(paramString.startIndex, offsetBy: 1))
    

    print(paramString)
    //output is:  b[0]=xxx&b[1]=xxxxxxx&a=xxx

【讨论】:

感谢您的回答。我知道这可以解决这个问题。但我想在服务器界面上解决这个问题。我已经将服务器的内容类型更改为 Application/Json。

以上是关于使用 moya 和 alamofire 时使用参数编码发布请求错误的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 MOYA/Alamfire 转义我的身体 json 参数?

Moya/Alamofire 请求变量问题

Moya + Alamofire 验证每个请求

moya 与 RxSwift 使用

Moya使用

在 Netfox 和 Moya 中记录 HTTPBody