Swift Alamofire:如何获取HTTP响应状态码

126

我想获取HTTP响应状态码(例如400、401、403、503等)以便处理请求失败(最好也能处理成功的情况)。在这段代码中,我正在使用HTTP基本身份验证进行用户认证,并希望能够在用户输入错误密码时向用户发送身份验证失败的消息。

Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
    .responseString { (req, res, data, error) in
        if error != nil {
            println("STRING Error:: error:\(error)")
            println("  req:\(req)")
            println("  res:\(res)")
            println("  data:\(data)")
            return
        }
        println("SUCCESS for String")
}
    .responseJSON { (req, res, data, error) in
        if error != nil {
            println("JSON Error:: error:\(error)")
            println("  req:\(req)")
            println("  res:\(res)")
            println("  data:\(data)")
            return
        }
        println("SUCCESS for JSON")
}

不幸的是,产生的错误似乎并未表明实际接收到了HTTP状态码409:

STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
  req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
  res:nil
  data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
  req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
  res:nil
  data:nil

另外,如果发生错误,能够检索HTTP正文内容会很好,因为我的服务器端将在那里放置错误的文本描述。

问题
是否可以在非2xx响应时检索状态代码?
是否可以在2xx响应中检索特定的状态代码?
是否可以在非2xx响应中检索HTTP正文内容?

谢谢!


1
如果您未经身份验证,则按设计会收到-999。不确定为什么会这样,也不知道如何解决... 您解决了吗? - Guido Hendriks
12个回答

1
对于使用 Alamofire > 2.0 的 Swift 2.0 用户。
Alamofire.request(.GET, url)
  .responseString { _, response, result in
    if response?.statusCode == 200{
      //Do something with result
    }
}

1
针对使用 Alamofire >= 5.0Swift 3.x / Swift 4.0 / Swift 5.0 用户:
使用请求修改器来增加和减少超时时间。 Alamofire 的请求创建方法提供了最常见的自定义参数,但有时这些参数并不足够。可以通过在创建请求时使用 RequestModifier 闭包来修改传递值所创建的 URLRequests。例如,要将 URLRequesttimeoutInterval 设置为 120 秒,请在闭包中修改请求。
var manager = Session.default
 manager.request(urlString, method: method, parameters: dict, headers: headers, requestModifier: { $0.timeoutInterval = 120 }).validate().responseJSON { response in

或者

RequestModifiers也可以使用尾随闭包语法。

var manager = Session.default
     manager.request("https://httpbin.org/get") { urlRequest in
    urlRequest.timeoutInterval = 60
    urlRequest.allowsConstrainedNetworkAccess = false
}
.response(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接