2017-08-03 4 views
0

私はモヤを使用してポストリクエストを作成しますが、ポストを送信するとサーバからエラーが返され、ボディパラメータをデコードできません。デフォルトでは、あまりにもモヤとアラモファイアを使用すると、パラメータエンコード後のリクエストエラーが発生する

パラメータの場合は、辞書などがあることがapplication/x-www-formは、URLエンコード、コンテンツ・タイプを設定し、サーバは、コンテンツタイプを受け入れる

public var parameterEncoding: ParameterEncoding { 
    return URLEncoding.default 
} 

これが同じであるようにパラメータをエンコードしますこの{"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

関連する問題