我使用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
如何解决这个问题?
答案 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