Ios 阿拉莫菲尔不';捕捉错误

Ios 阿拉莫菲尔不';捕捉错误,ios,swift,cocoa-touch,afnetworking,alamofire,Ios,Swift,Cocoa Touch,Afnetworking,Alamofire,我正在使用Alamofire从我的服务器获取数据。但是,它不会捕获错误,因为返回的错误是nil。我已经用AFNetworking进行了测试,效果很好。对于这两种操作,返回的状态代码都是401 Unauthorized。我的密码有什么问题吗 我正在使用我的后端。它所做的只是在请求失败时返回错误 GrapeAPI error!('Unauthorized', 401) af网络 manager.GET("someUrl", parameters: nil, success: { (_, objec

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

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

GrapeAPI

error!('Unauthorized', 401)
af网络

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
        }

我可以使用状态代码检查故障。但是我更喜欢检查error对象。但是,由于Alamofire中的错误为
nil
,因此检查请求是否失败非常容易混淆。

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

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

正如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
    }

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

更新了我的代码。这些是输出值。我没有给任何变量分配任何值:)在调用
.response()
@mattt之前,需要显式调用
.validate()
,这样才有效。阿拉莫菲尔在默认情况下被设计成这样而AFNetworking却不是这样,这有什么原因吗?是的,在这种情况下,显式选择加入更好。