2017-08-03 124 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