2016-10-10 18 views
0

私はすぐに簡単なPOSTリクエストをしようとしています。オブジェクト(アラーム)の配列をポストしたいと思います。ここで私はこれまで持っているものです。AlamofireとEVReflectionのJSON POSTリクエスト

func submitAlarms(alarms: [Alarm],onCompletion: @escaping ([Alarm]) -> Void){ 

    let route = baseURL 

    let token = SessionManager().storedSession!.token.idToken 

    let headers = [ 
     "Authorization": "Bearer \(token)" 
    ] 


    let parameters = [ 
     "alarms": alarms.toJsonString()] 

    print("Parameters ", parameters) 


    Alamofire.request(route, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) 
     .validate() 
     .responseJSON{ response in 

      switch response.result{ 
      case .failure(let error): 
       print("POST Alarm JSON Error: \(error)") 
      case .success(let value): 
       let json = JSON(value) 

       let alarms_json = json["alarms"] 

       print(alarms_json) 

       let alarms_string = alarms_json.rawString() 

       let alarms: [Alarm] = [Alarm](json: alarms_string) 

       //let alarms = [Alarm](json: res_string) 

       onCompletion(alarms) 

      } 

    } 

} 

I "mは主にどのような理由のために、Alamofireは、オブジェクトの配列を取るように見えることはできませんparameters部分で問題を抱えて、私はトップで辞書を作成しました。アラームの配列を保持レベルalarmキー私は、JSON文字列に私のアラーム配列を変換するEVReflectionを使用しますが、その変換は私にこれを与える:。。

Parameters ["alarms": "[\n{\n \"isActive\" : true,\n \"volume\" : 10,\n \"minute\" : 15,\n \"days\" : [\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6\n ],\n \"brightness\" : 10,\n \"hour\" : 6,\n \"audio\" : 4,\n \"duration\" : 1,\n \"label\" : \"Alarm\",\n \"allowSnooze\" : false,\n \"isSynchronized\" : false\n}\n]"] 

はどこにすべてのこれらの余分な\\nから来ている使用していますか? Alamofire、これらの余分な部分がそれをinvalにするので、サーバーは400で応答しますid JSON。私はここで何が欠けていますか?最新のAlamofireとEVReflectionを使ってXcode 8/Swift 3を使用しています。私は他の例を見てきましたが、ほとんどのものは古くなっています。それらの多くは拡張機能やカスタムエンコーディングも使用していますが、そのような単純な要求にはばかげています。よくあなたがやっているパラメータの作成については

答えて

0

:。。

let parameters = ["alarms": alarms.toJsonString()] 

あなたは文字列としてJSONが含まれています1つのparamaterを取得することを意味し EVReflectionは最初のアラームが辞書にオブジェクトを変換しますApple標準関数を使用してjsonに変換します。

JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) 

.prettyPrintedオプションを使用しているので、読みやすい形式で書式設定されます。これは、/ nを入力して、すばらしいレイアウトを作るためのスペースとスペースを追加することを意味します。

あなたのコードで変更する必要があるかどうかを確認するには、呼び出すapiを確認する必要があります。現在、あなたはhttpを取得しています。次に、パラメータは単純なキーと値のペアでなければなりません。すべてのオブジェクトプロパティを投稿する場合は、EVReflection toDictionary関数を使用できます。しかし、あなたの場合、私はあなたが投稿をする必要があると思う(Alamofireのドキュメントを参照してください)、そしてあなたはリクエスト本体にjsonを置くことができます。

P.S.私は偶然この問題を発見しました。また、https://github.com/evermeer/EVReflectionで問題を作成したり、https://gitter.im/evermeer/EVReflectionで質問したりできます。それから、通知が届きます。

+0

はい、私は実際にはアラームオブジェクトの配列を含む完全な辞書ですが、1つの項目と1つのjsonの文字列で辞書を作成していることに同意します。 Alamofireはそれをjsonに適切にエンコードします。toDictionaryは本当に奇妙な結果をもたらしましたが、私はそれに多くの時間を費やしていません。私はリンクをチェックアウトします、ありがとう – 7200rpm

+0

あなたはその他の辞書に辞書を追加していないことを確認してください。 .toDictionary()を実行し、それをパラメータに入れてください。 –

関連する問題