如何在 Alamofire Swift 中发送带有数组的字典

Posted

技术标签:

【中文标题】如何在 Alamofire Swift 中发送带有数组的字典【英文标题】:How to send dictionary with array in Alamofire Swift 【发布时间】:2016-08-17 11:00:48 【问题描述】:

我正在尝试在 POST API 中发送字典。为此,我正在使用 Alamofire。

参数字典如下:

 var param: Dictionary<String, AnyObject> =
        [
            "name"                     : name,
            "email"                    : email,
            "mobile_number"            : mobile_number,
            "body"                     : body
            ] as Dictionary<String, AnyObject>


    param["listing_ids[]"] = [772121,772136,772129]

向Server发送请求如下:

Alamofire.request(.POST,baseUrl+enquiryEndPoint , parameters: params , encoding: .URL, headers: createHeader()).responseJSON  response in
        switch response.result 
        case .Success:
            guard let response = response.result.value as? Dictionary<String, AnyObject> elsereturn
            completionBlock(response,error: nil)
        case .Failure(let error):
            completionBlock([:],error: error)
        

    

打印参数字典时,报错如下:

["mobile_number": 457823356, "email": s@gmail.com, "body": Hello, I found your property on <country-website>. Please send me additional information about this property.
Thank you, "listing_ids[]": <_TtCs21_SwiftDeferredNSArray 0x1400d6ff0>(
708783,
589915,
722173,
746261,
618410
)
, "name": s]

键“listing_ids[]”对应的值是一个Int数组。这在这里引起了问题。

那里写着“_TtCs21_SwiftDeferredNSArray”的东西,我完全不清楚。

因此我收到空白回复。

请帮帮我。

【问题讨论】:

您解决了这个问题吗? @AnandPrem 是的,我已经通过升级 swift 3.0 的 Alamofire 版本解决了这个问题 【参考方案1】:

正如post 中提到的,您可以尝试更改请求的编码

Alamofire.request(.POST,baseUrl+enquiryEndPoint , parameters: params , encoding: .URL, headers: createHeader()).responseJSON  response in

Alamofire.request(.POST,baseUrl+enquiryEndPoint , parameters: params , encoding: .JSON, headers: createHeader()).responseJSON  response in

注意只是方法的编码参数改变了

【讨论】:

嗨..我也试过.JSON。但 API 应为 .URL 编码。【参考方案2】:

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

因此,您必须将字典更改为字典。下面的代码工作正常,可以根据您的要求打印字典。

    var param: Dictionary<String, Any> = [
            "name"                     : "name",
            "email"                    : "email",
            "mobile_number"            : 123132,
            "body"                     : "Hello"
            ]

    param["listing_ids[]"] = [772121,772136,772129]

    print(param)

【讨论】:

谢谢 Aseem.... 我已经尝试过这个解决方案,但正如我所说,我正在使用 Alamofire 进行网络调用,所以 Alamofire 只接受 Dictionary 中的参数。无法将参数作为 Dictionary 传递。有没有其他方法可以解决这个问题?

以上是关于如何在 Alamofire Swift 中发送带有数组的字典的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 在 Alamofire 中发送带有对象数组的 JSON 作为参数

带有 XML 响应和正文的 SOAP 请求 swift 3,Alamofire

如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?

使用 Alamofire 3.0+ 在 swift 2.2 中使用 JSON 对象发送 POST 请求

在 Alamofire 中 Swift 发送参数

如何在 Swift 中的 Alamofire 中发送 body 参数?