2017-08-03 37 views
0

我使用moya发布发布请求,但是当我发送帖子时,服务器给我一个错误,它不能解码身体参数。我使用URLEncoding。默认以编码像这样使用moya和alamofire时参数编码的发布请求错误

public var parameterEncoding: ParameterEncoding { 
    return URLEncoding.default 
} 

它将设置内容类型application/x-WWW窗体-urlencoded,服务器接受内容类型是相同的参数太

如果参数是象字典这个{“a”:“b”},运行良好,但如果字典包含数组或其他字典,则服务器无法从请求主体获取参数。

EX:

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

alamofire将编码此像 “一个”= “XXX” & B [] = XXXX & B [] = XXX

但服务器期望= 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 
+0

谢谢您的回答。我知道这可以解决这个问题。但我想解决这个问题在服务器接口上。我已经将服务器的内容类型更改为Application/Json。 – RockyAo