【问题标题】:Post request error with parameter encode when use moya and alamofire使用 moya 和 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

如何解决这个问题?

【问题讨论】:

    标签: ios spring-mvc alamofire moya


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2017-10-29
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多