Alamofire 没有发现错误

Alamofire doesn't catch error

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

我正在使用 GrapeAPI 作为我的后端。它所做的只是 return 请求失败时的错误

GrapeAPI

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

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,因此检查请求是否失败非常混乱。

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

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")
               }
           }
        }

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

正如 Matt 在评论中提到的,我需要在调用 .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(谢谢!)了解更多信息。