Swift - 8tracks.com API POST json数据每次都失败(422)

时间:2014-06-25 19:52:26

标签: objective-c json api swift afnetworking-2

我正在尝试与Swift iOS应用中的8tracks开放式API进行对话。我需要使用AFNetworking向http://8tracks.com/sessions.json发出POST授权请求,但每次出现422 Unprocessable Entity错误时都会发出错误。

我在网上尝试了这个端点,它运行正常。这是我正在使用的代码(子类化AFHTTPSessionManager):

init() {
    super.init()

    self.responseSerializer = AFJSONResponseSerializer()
    self.requestSerializer = AFJSONRequestSerializer()

    self.requestSerializer.setValue(API_KEY, forHTTPHeaderField: "X-Api-Key")
    self.requestSerializer.setValue("3", forHTTPHeaderField: "X-Api-Version")
}

func login(username: String, password: String, success: (NSURLSessionDataTask!, AnyObject!) -> Void, failure: ((NSURLSessionDataTask!, NSError!) -> Void)?) {
    let credentials = ["username": username, "password": password] as Dictionary

    self.POST(
        API_URL.stringByAppendingString("/sessions.json"),
        parameters: credentials,
        success: success,
        failure: failure
    )
}

错误如下所示:

{ URL: http://8tracks.com/sessions.json } { status code: 422, headers {
"Accept-Ranges" = bytes;
"Access-Control-Allow-Origin" = "*";
Age = 0;
"Cache-Control" = "max-age=0, private, must-revalidate";
Connection = "keep-alive";
"Content-Length" = 125;
"Content-Type" = "application/json; charset=utf-8";
Date = "Wed, 25 Jun 2014 19:29:12 GMT";
Server = "nginx/1.4.3";
Status = "422 Unprocessable Entity";
Via = "1.1 varnish";
"X-Action" = "sessions/create";
"X-Backend" = rails;
"X-Cache" = MISS;
"X-Data-Request" = 1;
"X-Request-Id" = 3040c8bf79936b27075731f634bfd534;
"X-Requests-Left" = 99;
"X-Runtime" = "0.257240";
"X-UA-Compatible" = "IE=Edge,chrome=1";
} }, NSLocalizedDescription=Request failed: client error (422), 
NSErrorFailingURLKey=http://8tracks.com/sessions.json}

1 个答案:

答案 0 :(得分:1)

它可能与没有baseURL的子类AFHTTPSessionManager有关。我已经测试了以下代码并且它可以工作。

let path = "/sessions.json"
let params = ["login": login, "password": password, "api_version": "3"]

let success = {(task: NSURLSessionDataTask!, response: AnyObject!) -> Void in
    println(response)
}

let failure = {(task: NSURLSessionDataTask!, error: NSError!) -> Void in
    println(error)
}

var client = AFHTTPSessionManager(baseURL:  NSURL(string: "https://8tracks.com"))
client.POST(path, parameters: params, success: success, failure: failure)