我正在与来自不同项目的不同人员在线工作,他们负责后端API Web服务。通常我没有发送和接收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错误的请求错误。我甚至还试过这个:
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“无法解析 响应“UserInfo = {NSUnderlyingError = 0x7fbb505788f0 {错误 Domain = kCFErrorDomainCFNetwork Code = -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(可能是因为在服务器上,代码根本不需要检查或验证正文,因为它不需要任何东西,因此没有错误提高)。问题是当我提出需要任何参数的请求时。
答案 0 :(得分: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
}