【问题标题】:Swift - 8tracks.com API POST json data fails (422) everytimeSwift - 8tracks.com API POST json 数据每次都失败 (422)
【发布时间】:2014-06-25 19:52:25
【问题描述】:

我正在尝试与 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}

【问题讨论】:

  • 你提到“我在网上试过这个端点,它工作正常”。您可以 POST 或 GET 吗?
  • @YarGnawh 我用 json 数据和 Javascript 进行 POST 请求进行身份验证,效果很好
  • 为什么要减去这个问题??
  • 嗯。根据您的控制台日志,您的标题似乎没有被分配。我没有看到“X-Api-Key”或“X-Api-Version”。在发帖之前登录self.requestSerializer.HTTPRequestHeaders,看看是否设置了标题。
  • @YarGnawh 这里一切都很好。{ "Accept-Language" = "en;q=1"; "User-Agent" = "MY_APP/1 (iPhone Simulator; iOS 8.0; Scale/2.00)"; "X-Api-Key" = MY_KEY; "X-Api-Version" = 3; }

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


【解决方案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)

【讨论】:

  • 这个问题非常非常愚蠢..我把loginusername搞混了:)
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多