如何在Alamofire中将体型设置为JSON?

时间:2016-06-07 09:55:10

标签: ios json swift alamofire

我正在与来自不同项目的不同人员在线工作,他们负责后端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(可能是因为在服务器上,代码根本不需要检查或验证正文,因为它不需要任何东西,因此没有错误提高)。问题是当我提出需要任何参数的请求时。

1 个答案:

答案 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
}