【问题标题】:Alamofire error is always nil, while request failsAlamofire 错误始终为零,而请求失败
【发布时间】:2023-03-23 13:25:01
【问题描述】:

如果出现 400(错误请求)或 403(未经授权),我只能从响应中获取有关失败的信息,而错误,传入的参数始终为零 - 是否需要任何额外设置?

 Alamofire.request(Router.SignIn(emailField.text, passwordField.text)).response { (request, response, data, error)  in

        println(error)
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }

UPD:正如马特建议的那样,添加了这样的验证:

        Alamofire.request(UdacityRouter.SignIn(emailField.text, passwordField.text)).validate().response
       in

        println(error)
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }

结果我收到了"Optional("The operation couldn’t be completed. (com.alamofire.error error -1.)")"什么远非有意义的失败解释..我想知道为什么我不能像AFNetworking那样简单地通过简单的失败解释得到错误..

【问题讨论】:

  • 如果你想让HTTP状态码产生错误,你需要添加.validate()。
  • 谢谢,我试试!但是默认添加这种行为不是更有用吗?
  • 没有。内容类型和状态代码验证是有意选择加入 Alamofire 的。

标签: swift alamofire


【解决方案1】:

需要添加 .validate() 因为默认情况下,Alamofire 将任何已完成的请求视为成功,无论响应的内容如何。

来自 Alamofire 文档:

验证

默认情况下,Alamofire 将任何已完成的请求视为成功, 无论响应的内容如何。在 a 之前调用 validate 如果响应有,响应处理程序会导致生成错误 不可接受的状态代码或 MIME 类型。

手动验证

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .validate(statusCode: 200..<300)
         .validate(contentType: ["application/json"])
         .response { _, _, _, error in
             println(error)
         } 

自动验证

自动验证 200...299 范围内的状态码,并且 响应的 Content-Type 标头与 Accept 标头匹配 请求(如果提供)。

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .validate()
         .response { _, _, _, error in
             println(error)
         }

【讨论】: