2016-04-12 58 views
6

私のアプリは現在、AWS API GatewayとAlamofireを使用して、バックエンドとして機能するさまざまなラムダ機能にアクセスしています。Alamofire POSTリクエストで配列をパラメータとして送信

私はそのために、私は次のコードを使用しています、これらのAPIエンドポイントの一つにパラメータの1つとして配列を送信する必要があります。

 var interests : [String] 
     interests = globalInterests.map({ (interest) -> String in 
      return interest.id! 
     }) 

     // Parameters needed by the API 
     let parameters: [String: AnyObject] = [ 
      "name" : name, 
      "lastName" : lastName, 
      "interests" : interests 
     ] 


     // Sends POST request to the AWS API 
     Alamofire.request(.POST, url, parameters: parameters, encoding: .JSON).responseJSON { response in 

      // Process Response 
      switch response.result { 

      case .Success: 

       print("Sucess") 

      case .Failure(let error): 
       print(error) 
      } 
     } 

をしかし、それが原因でアレイで動作していませんAPIによって認識されていませんが、静的配列を作成する場合は

let interests = ["a", "b", "c"] 

すべてが正常に動作します。

利益の配列がコードの別の部分から来ている場合、どのように宣言するか、または構築する必要があるのでしょうか?

はあなただけ宣言した
["name":test, "interests": <_TtCs21_SwiftDeferredNSArray 0x7b05ac00>(103, 651, 42), "lastName": test] 
+0

! ? – Lion

+2

私は「利益」は常に空であり、利益を計算するコードは私には意味がないと思います。空の配列が宣言されていて、それをマップしようとしました。その部分を明確にすることはできますか? – Shripada

+0

質問を編集したところ、コードをコピーするときに間違いを犯しました。マップの後、配列は空ではなく、3つの値を持つ[(String)]です – ur3k

答えて

3

AnyObjectはクラスタイプのみを表すことができます。 Swiftでは、他の多くの言語ではクラス型の代わりに配列と辞書が構造化されています。構造体をAnyObjectに記述することはできません。なぜなら、Anyが入ってくる理由です。クラスのほかに、構造体や列挙型を含む他のすべての型でもAnyを利用できます。

したがって、キャスト配列または辞書をAnyObjectに入力すると、_TtCs21_SwiftDeferredNSArrayエラーが発生します。AnyObjectではなくAnyにする必要があります。

let parameters: [String: Any] = [ 
     "name" : name, 
     "lastName" : lastName, 
     "interests" : interests 
    ] 
1

問題がされていること:これは私が示したパラメータの配列を印刷

友人が

ArrayList<String> 

EDITを使ってAndroidの中でこれを実現するために管理しました配列を初期化しません。これは、たとえuがデータを挿入しようとしても、関心配列をnilにします。 ValueArrayは=ましょう

var interests = [String]() 

代わりの

var interests : [String] 
+0

これを試しましたが、問題は同じです – ur3k

0

書いてみ[ "USERID":名前を、 "パスワード":パスワード]

パスValueArray [パラメータ:ValueArray]も受け入れエンコーディングを確認APIによって

+0

これは実際にはパラメータ配列の作成方法ですが、問題はそれらのパラメータの1つとして配列を送信しようとしたときです文字列のみで作業する場合はすべて問題ありません。 – ur3k

0

配列のIDが重複すると問題が判明しました。 APIの背後にあるコードは、エラーとして返送されていなかった例外を送出しました。

他の回答はすべて正しいですが、問題を見つけてテストしたところ、すべてがうまくいっていますので、私はそれらを投票します。

ありがとうございました。

+0

この問題をどうやって解決しましたか?重複したエントリの問題ではありません。私もあなたと同じ結果を得ます。 「人」:<_TtCs21_SwiftDeferredNSArray 0x7f7f565d1440>( 3,) '。 – oyalhi

+0

私の場合、問題はサーバー側であり、Alamofireの問題ではありませんでした。私はあなたに何が起こっているかについての詳細を新しい質問を開くことをお勧めします。 – ur3k

11

JSONをエンコードするためにNSJSONSerializationを使用することにより、あなたはAlamofireでそれを使用するための独自のNSURLRequestを構築することができ、ここでスウィフト3例です:戻りinterests.idによって返される何

//creates the request   

    var request = URLRequest(url: try! "https://api.website.com/request".asURL()) 

    //some header examples 

    request.httpMethod = "POST" 
    request.setValue("Bearer ACCESS_TOKEN_HERE", 
        forHTTPHeaderField: "Authorization") 

    request.setValue("application/json", forHTTPHeaderField: "Accept") 

    //parameter array 

    let values = ["value1", "value2", "value3"] 

    request.httpBody = try! JSONSerialization.data(withJSONObject: values) 

    //now just use the request with Alamofire 

    Alamofire.request(request).responseJSON { response in 

     switch (response.result) { 
     case .success: 

      //success code here 

     case .failure(let error): 

      //failure code here 
     } 
    } 
} 
関連する問題