如何在 Alamofire 中将正文类型设置为 JSON?

Posted

技术标签:

【中文标题】如何在 Alamofire 中将正文类型设置为 JSON?【英文标题】:How to set body type to JSON in Alamofire? 【发布时间】:2016-06-07 09:55:10 【问题描述】:

我正在与来自不同项目的不同人员在线工作,他们负责后端 API 网络服务。通常我在发送和接收 JSON 方面没有问题,但这次,我似乎无法将 JSON 正确发送到服务器。

通常我使用 Alamofire 来接收和发送 JSON 消息,通常的调用是这样的:

let param = populateParamWithDictionary();
let url = "https://www.example.com";

Alamofire.request(.POST, url, parameters: param, headers: nil)
.responseJSON  response in 
  // take care of response here

但这一次,我得到了后端程序员要求我使用 OAuth v2 的项目。所以,假设我已经开发了一个已经负责获取 access_token 字符串的函数。现在函数变成了这样:

let param = populateParamWithDictionary();
let url = "https://www.example.com";
let headers : Dictionary<String, String> = [
        "Content-Type":"application/json",
        "Authorization":"Bearer \(access_token)"
    ];

Alamofire.request(.POST, url, parameters: param, headers: headers)
.responseJSON  response in 
  // take care of response here

但我得到 400 bad request 错误,而不是结果。我什至也试试这个:

let param = populateParamWithDictionary();
let url = "https://www.example.com";
let headers : Dictionary<String, String> = [
        "Content-Type":"application/json",
        "Authorization":"Bearer \(access_token)"
    ];

Alamofire.request(.POST, url, parameters: param, encoding: ParameterEncoding.JSON, headers: headers)
.responseJSON  response in 
  // take care of response here

但结果更糟。这是我打印响应时得到的结果。

FAILURE: Error Domain=NSURLErrorDomain Code=-1017 "无法解析 响应“用户信息 = NSUnderlyingError = 0x7fbb505788f0 错误 Domain=kCFErrorDomainCFNetwork 代码=-1017 "(null)" UserInfo=_kCFStreamErrorCodeKey=-1, _kCFStreamErrorDomainKey=4, NSErrorFailingURLStringKey=http://lfapp.learnflux.net/v1/me, NSErrorFailingURLKey=http://lfapp.learnflux.net/v1/me, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSLocalizedDescription=无法解析响应

但是如果我使用 REST 客户端,通过将标头设置为具有身份验证和 Content-Type,并将参数写入纯内容,例如在正文内容中的普通 API 中。

我该如何解决这个问题?

编辑:带有访问令牌的部分已经很清楚了。访问令牌有效。如果 API 不需要任何参数,我可以成功调用 API(可能是因为在服务器上,代码根本不需要检查或验证主体,因为它不需要任何东西,因此没有错误提高)。问题是当我发出需要任何参数的请求时。

【问题讨论】:

也许你可以记录 request.response 来找出你为什么cannot parse response,也许你收到了数据但无法解析它,服务器可能会返回你意想不到的东西。 @KleinMioke 我不知道。现在我放弃了 Alamofire 并使用 NSJSONSession,一切正常,尽管我给 NSJSONSession 提供了完全相同的配置(我认为)。 我看了Alamofire的源码,发现如果你使用.URL选项,它会自动将Content-type设置为application/json,并使用NSJSONSerialization将params转换为NSData。在此步骤中可能会因转换失败而导致错误,但此错误从未使用过。这意味着您应该保证 params 字典必须可以转换为数据。请参阅文件 ParameterEncoding.swift 第 144 行。我认为这是一个可能的潜在原因。 【参考方案1】:

您遇到的错误可能是由于请求中的encoding: ParameterEncoding.JSON。尝试将其更改为encoding: .URLEncodedInURL。如果这对您没有帮助,请将您的参数添加到问题中,如果您请求获取令牌,请执行以下操作:

if let access_token = json["access_token"]!
     // Make the request here when you know that you have your token

【讨论】:

感谢您的回答。这个案例在此之前陷入僵局,然后我求助于使用 Apple 框架提供的通用本机连接类进行后备,效果非常好。下次我再次使用 Alamofire 时,我会尝试您的解决方案。

以上是关于如何在 Alamofire 中将正文类型设置为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Alamofire 中请求带有正文和标头的 JSON?

在Firefox中将焦点设置为iframe正文/内容?

如何在 Retrofit 库中将 YAML 响应正文解析为 POJO?

Swift 3 Alamofire JSON 响应

如何在alamofire中将参数作为字符串发送

如何在 Alamofire 正文 + 参数中创建请求