使用 Alamofire Swift3 发送复杂参数得到状态码 500 错误

Posted

技术标签:

【中文标题】使用 Alamofire Swift3 发送复杂参数得到状态码 500 错误【英文标题】:Sending complex parameter with Alamofire Swift3 gets Status Code 500 error 【发布时间】:2017-04-25 19:04:08 【问题描述】:

我在 Alamofire 和 JSON 方面的经验很少。我在互联网上搜索了很多,并在提出这个问题之前尽我所能,所以请理解我。

我正在尝试使用 Alamofire 使用 .put 方法发送参数。

当我用 PostMan(Chrome Extension) 测试发送参数时,一切正常。

参数是这样的

update_values : "address":"Sanchaung", "phone":["095567890", "094272732"], "emergency_phone":["name":"someone", "phone":"3454234","name":"sometwo", "phone":"3454234"]

“address”是字符串,“phone”是字符串数组,“emergency_phone”是 字典数组

我这样在swift3中声明参数

let ep : NSDictionary = [
            "name" : "someone",
            "phone" : "12345"
        ]

let uv : NSDictionary = [
            "address" : "Sanchaung",
            "phone" : ["123","1234"],
            "emergency_phone" : [ep,ep]
        ]

let parameters = [
            "update_values" : uv
        ]

然后像这样用 Alamofire 发送

Alamofire.request("http://myLink.com/api/employees/10?auth_token=\(vc.userInform.auth_token)", method: .put, parameters: parameters, encoding: JSONEncoding.default, headers: nil)
            .validate()
            .responseJSON  response in
                switch(response.result)
                
            case .success(let JSON) :

            case .failure(let error) :

                print(" UPDATING ERROR IS \(error)")
            
    

然后我收到状态码 500 错误

UPDATING ERROR IS responseValidationFailed(Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(500))

我收到该错误是因为我的参数不是可接受的类型吗? 如何以正确的方式发送该参数?

请帮我解决这个问题。谢谢。

【问题讨论】:

【参考方案1】:

使用

    let ep: [String: Any] = [
        "name" : "someone",
        "phone" : "12345"
    ]

    let uv: [String: Any] = [
        "address" : "Sanchaung",
        "phone" : ["123","1234"],
        "emergency_phone" : [ep,ep]
    ]

    let parameters = [
        "update_values" : uv
    ]

而不是你的代码。

您可以将json序列化的结果与:

    let data = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)

    print(String(data: data!, encoding: .utf8))

【讨论】:

感谢您的回答,但仍然无法正常工作。我打印了 JSNSerialization json serializationOptional("\n \"update_values\" : \n \"phone\" : [\n \"123\",\n \"1234\"\n ],\n \"emergency_phone\" : [\n \n \"phone\" : \"12345\",\n \"name\" : \"someone\"\n ,\n \n \"phone\" : \"12345\",\n \"name\" : \"someone\"\n \n ],\n \"address\" : \"Sanchaung\"\n \n") 但我不知道通过比较结果可以实现什么。 好的,包含您的身份验证令牌空间字符? 我序列化了 uv,它工作了。非常感谢【参考方案2】:

老实说,这里可能存在几个问题 - 错误 500 表明您的参数已到达服务器,但它不理解它们并崩溃。

你的参数对我来说似乎没问题。但我建议检查邮递员使用的标题,如"Content-Type" : "application/json"。尝试在您的代码中复制它们。服务器可能需要此标头来确定其下一步操作,并且缺少此信息可能会导致失败。

【讨论】:

感谢您的回答。我添加了这一行 .validate(contentType: ["application/json"]) 但仍然收到状态码 500 错误。 也许可以尝试将其添加为标头,这样您将发送headers: ["Content-Type": "application/json"] 而不是 nil。 .validate 函数确保 response 在我们尝试将内容类型添加到 request 本身时具有此内容类型 谢谢。我添加了标题:["Content-Type" : "application/json"],但仍然不走运。

以上是关于使用 Alamofire Swift3 发送复杂参数得到状态码 500 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Alamofire,swift 3 中将字典作为参数发送

Json 解析 Swift 3 Alamofire

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

URL编码参数中的布尔值在Swift3中使用Alamofire编码为0和1

使用 Alamofire 为参数发送“Null”值

在 swift 中使用 alamofire 发送 JSON 数组作为参数