web-dev-qa-db-ja.com

Alamofire POSTリクエストのパラメーターとして配列を送信します

私のアプリは現在、AWS API GatewayとAlamofireを使用して、バックエンドとして機能するさまざまなラムダ関数にアクセスしています。

次のコードを使用しているため、これらのAPIエンドポイントの1つにパラメーターの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"] 

すべてが想定どおりに機能します。

対象の配列がコードの別の部分からのものである場合、この状況をどのように修正できますか?どのように宣言または構築する必要がありますか?

友人はAndroid

ArrayList<String>

編集:

パラメータ配列を印刷すると、次のことがわかります。

["name":test, "interests": <_TtCs21_SwiftDeferredNSArray 0x7b05ac00>( 103, 651, 42), "lastName": test]
7
ur3k

AnyObjectは、クラスタイプのみを表すことができます。 Swiftでは、配列と辞書は、他の多くの言語のクラスタイプではなく、構造体です。構造体をAnyObjectに記述できないため、Anyが登場します。クラスの他に、Anyは構造体や列挙型を含む他のすべての型でも利用できます。

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

    let parameters: [String: Any] = [
        "name" : name,
        "lastName" : lastName,
        "interests" : interests
    ]
3
Aseem Aggawral

NSJSONSerializationを使用してJSONをエンコードすることで、Alamofireで使用するための独自のNSURLRequestを作成できます。ここにSwiftの例を示します。

    //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
        }
    }
}
16
mourodrigo

問題は、配列を宣言したばかりで、初期化していないことです。これにより、データを挿入しようとしても、インタレスト配列がnilになります。書いてみてください

var interests = [String]()

の代わりに

var interests : [String]
1
mshrestha

let ValueArray = ["userid":name、 "password":password]

pass ValueArray [parameters:ValueArray]は、APIによって受け入れられたエンコーディングも検証します。

0
Abhishek

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

他のすべての答えは正しいです、私は問題を見つけた後にそれらをテストしました、そしてすべてがうまくいったので、私はそれらに賛成票を投じるつもりです。

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

0
ur3k