0

我使用 moya 发出帖子请求,但是当我发送帖子时,服务器给我一个错误,它无法解码正文参数。我使用 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

如何解决这个问题呢 ?

4

1 回答 1

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
于 2017-08-03T11:53:50.240 回答