【问题标题】:Alamofire doesn't catch errorAlamofire 没有发现错误
【发布时间】:2015-09-03 13:22:03
【问题描述】:

我正在使用 Alamofire 从我的服务器获取数据。但是,它没有捕获错误,因为返回的错误是 nil。我已经用 AFNetworking 进行了测试,它工作正常。对于这两种操作,返回的状态码都是 401 Unauthorized 。我的代码有问题吗?

我在后端使用GrapeAPI。它所做的只是在失败请求时返回错误

葡萄API

error!('Unauthorized', 401)

AFNetworking

manager.GET("someUrl", parameters: nil, success: { (_, object) in

        }, failure: { (operation, error) in
            // These are the outputs. I'm not assigning any values
            // error.localizedDescription = "Request failed: unauthorized (401)"
            // statusCode = 401
        })

阿拉莫火

Alamofire.request(.GET, "url", parameters: nil)
        .response { (a,b,data,error) in
        // These are the outputs. I'm not assigning any values
        // error = nil
        // data = {"error":"Unauthorized"}
        // statusCode = 401
        }

我可以使用 statusCode 检查失败。但我更喜欢检查错误对象。但是,由于 Alamofire 中的错误是 nil,因此检查请求是否失败是相当混乱的。

【问题讨论】:

  • 您需要在调用.response()之前明确调用.validate()
  • @mattt 这行得通。为什么 Alamofire 被设计为默认以这种方式运行而 AFNetworking 不是?
  • 是的,在这种情况下明确选择加入会更好。

标签: ios swift cocoa-touch afnetworking alamofire


【解决方案1】:

Alamofire 不会将 401 Unauthorized 视为错误,因为它是有效的返回。在您的评论代码中,您正在为错误分配一个值,而不是检查它是否有错误,它应该是:

Alamofire.request(.GET, "url", parameters: nil)
        .response { (a,b,data,error) in
        if error != nil{
            println(error.localizedDescription)
        } else {
            if let data = data{
               //You should probably use a switch statement here
               if data.statusCode == 401 {
                   println("Unauthorized")
               } else if data.statusCode == 200 {
                   println("Success")
               }
           }
        }

我不确定我是否正确理解了您的问题,但希望对您有所帮助!

【讨论】:

  • 更新了我的代码。这些是输出值。我没有为任何变量分配任何值:)
【解决方案2】:

正如马特在评论中提到的,我需要在调用.response() 之前添加.validate()。这是设计使然。最终代码如下:

Alamofire.request(.GET, "url", parameters: nil)
    .validate()
    .response { (a,b,data,error) in
    // error won't be nil now
    // and statusCode will be 401
    }

阅读this detailed explanation(谢谢!)了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2015-07-05
    • 2011-03-11
    相关资源
    最近更新 更多