POST 请求 Swift 3.0 Alamofire

Posted

技术标签:

【中文标题】POST 请求 Swift 3.0 Alamofire【英文标题】:POST Request Swift 3.0 Alamofire 【发布时间】:2017-02-04 10:58:55 【问题描述】:

我正在尝试在 Swift 3 中使用 Alamofire 执行 .POST 请求。我编写了以下函数

func postToken(Token: String) 
    let parameters : [String:Any] = ["api_key":"ivaomobileapp", "function":"login", "IVAOTOKEN=":"\(Token)"]
    Alamofire.request("URL", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON  (response:DataResponse<Any>) in

        switch(response.result) 
        case .success(_):
            if let data = response.result.value
                print(data)
            
            break

        case .failure(_):
            print(response.result.error as Any)
            break

        
    

但是代码不起作用,它给出了以下错误:

Alamofire.AFError.responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo=NSDebugDescription=Invalid value around character 0.))

这与 CURL(UNIX) 中的请求相同

curl https://whatever -X POST -F 'api_key=ivaomobileapp' -F 'function=Login' -F 'IVAOTOKEN=whatever'

我做错了什么?

谢谢

【问题讨论】:

服务器端响应不正常,你的代码没问题 答案是无效的 JSON 对象。 @Anbu.Karthik 我让它现在返回 JSON,仍然是同样的问题。 验证你的 json 一次, @Anbu.Karthik 这是我现在返回的内容:"msg":"用户登录成功输入。" 【参考方案1】:

我认为您以错误的方式处理添加了 IVAOTOKEN 参数,从而导致问题,可能会创建格式错误的字典。也许您的参数应该如下所示:

let parameters : [String:Any] = [
      "api_key": "ivaomobileapp", 
      "function": "login", 
      "IVAOTOKEN": Token
]

Alamofire 将在 Token 变量周围添加引号,因为它是一个字符串。结果应该是以下内容被发送到服务器:


    "api_key": "ivaomobileapp", 
    "function": "login", 
    "IVAOTOKEN": "TOKENVALUE"

【讨论】:

发送 api_key 参数时出现问题,在 CURL 请求中如下 'api_key=ivaomobileapp'。我应该把 = 放在 Alamofire 的某个地方吗?抱歉,我从来没有用 Alamofire 做过 POST 请求 :( 好吧,您是否真的将值 ivaomobileapp 用于 api_key 参数?我认为一把钥匙看起来实际上看起来有些不同。也许像某种随机散列。无论哪种方式,= 符号都不应该是参数键的一部分。 Alamofire 会将您的参数转换为有效的 JSON,因此会在键和值之间添加 = 符号。 我认为您应该 100% 确定您可以将此值用作 API 密钥,因为它非常不寻常。通常它是随机散列或类似的。特别是如果你将它与 Facebook、Twitter、Flickr 等的 API 密钥进行比较...... 是的,完全确定,CURL 使用该值。我的中国伙伴制作了这个 API,所以可能是普通话和英语之间的误译。 嗯,与您的 curl 请求不同的是,在您的 curl 请求中,您实际上不发送 JSON,而是使用表单请求。因此,您可能想要更改不同类型的请求。如果您的服务器支持,或者将您的 curl 请求转换为 JSON 请求。【参考方案2】:

来自服务器的响应不是有效的 json 尝试使用 responseStringresponseDataresponse 找出问题所在。

【讨论】:

我不明白你的意思。我尝试更改为 responseData,同样的问题。 my 表示服务器端数据不是有效的 JSON 我该怎么做才能弄清楚?

以上是关于POST 请求 Swift 3.0 Alamofire的主要内容,如果未能解决你的问题,请参考以下文章

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

Swift 2.0 + Alamofire 3.0 - 缓慢加载 JSON

Alamofire4在使用方法时抛出“额外参数方法”:.post

发送 Alamofire JSON 数组 Swift

Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)

在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作