【发布时间】: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 行。我认为这是一个可能的潜在原因。