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

时间:2017-08-03 11:16:00

标签: ios spring-mvc alamofire moya

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

public var parameterEncoding: ParameterEncoding {
    return URLEncoding.default
}

它将设置内容类型application / x-www-form-urlencoded,并且服务器接受内容类型也是相同的

如果参数是像这样的字典{“a”:“b”},那么效果很好,但如果字典包含数组或其他字典,则服务器无法从请求体中获取参数。

EX:

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

alamofire会对此进行编码 “A”= “XXX” 和b [] = XXXX和b [] = XXX

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

如何解决这个问题?

1 个答案:

答案 0 :(得分: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