在 Alamofire POST 请求中发送一个数组作为参数

Send an array as a parameter in a Alamofire POST request

我的应用目前正在使用 AWS API Gateway 和 Alamofire 来访问充当我的后端的不同 lambda 函数。

我需要将数组作为参数之一发送到这些 API 端点之一,为此我使用以下代码:

        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 识别,但如果我创建一个 "static" 数组

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

一切正常。

如果利益数组来自代码的另一部分,我该如何解决这种情况,我应该如何声明或构造它?

一位朋友在 Android 中使用

成功完成了这项工作
ArrayList<String>

编辑:

打印参数数组显示如下:

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

问题是你刚刚声明了数组而没有初始化它。即使您尝试插入数据,这也会使兴趣数组为零。尝试写

var interests = [String]()

而不是

var interests : [String]

让 ValueArray = ["userid": 名称,"password":密码]

pass ValueArray [parameters: ValueArray] 同时验证API接受的编码。

原来是数组id重复的问题。 API 背后的代码引发了一个异常,该异常未作为错误发回。

所有其他答案都是正确的,我在发现问题后对它们进行了测试并且一切正常所以我要给它们投票。

非常感谢。

AnyObject 只能表示 class 类型。在 Swift 中,Array 和 Dictionary 是结构体,而不是许多其他语言中的 class 类型。 struct 不能描述成 AnyObject,这就是 Any 出现的原因。除了 class,Any 还可以用于所有其他类型,包括 struct 和 enum。

因此,每当我们将数组或字典类型转换为 AnyObject _TtCs21_SwiftDeferredNSArray 错误 occurs.So 我们必须使用 Any 而不是 AnyObject。

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

通过使用NSJSON序列化编码JSON,你可以构建自己的NSURLRequest以便在Alamofire中使用它,这里是Swift 3 示例:

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