使用 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 时使用参数编码发布请求错误的主要内容,如果未能解决你的问题,请参考以下文章