我有一个非常简单的场景,我正在努力。我正在使用Alamofire在rest API上注册用户。第一次注册调用成功,用户可以登录。第二次调用,当尝试使用相同的电子邮件地址注册时,应该从服务器生成HTTP状态代码409。但是,Alamofire会返回一个带有空请求和响应的.Success。我用postman测试了这个API,它正确返回409。
为什么Alamofire没有返回.Failure(错误),错误有状态代码信息等?
这是我每次使用相同输入运行的调用。
Alamofire.request(.POST, "http://localhost:8883/api/0.1/parent", parameters: registrationModel.getParentCandidateDictionary(), encoding: .JSON).response(completionHandler: { (req, res, d, e) -> Void in
print(req, res, d, e)
})
来自Alamofire manual:
验证
默认情况下,无论响应的内容如何,Alamofire都会将任何已完成的请求视为成功。如果响应具有不可接受的状态代码或MIME类型,则在响应处理程序之前调用validate会导致生成错误。
您可以再次使用validate
方法手动验证状态代码:
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])
.response { response in
print(response)
}
或者,您可以使用不带参数的validate
半自动验证状态代码和内容类型:
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.validate()
.responseJSON { response in
switch response.result {
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
}
}
如果使用response
,您可以检查NSHTTPURLResponse
参数:
Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
.response { response in
if response.response?.statusCode == 409 {
// handle as appropriate
}
}
默认情况下,4xx状态代码不被视为错误,但您可以使用validate
将其视为此类,然后将其折叠为更广泛的错误处理:
Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
.validate()
.response() { response in
guard response.error == nil else {
// handle error (including validate error) here, e.g.
if response.response?.statusCode == 409 {
// handle 409 here
}
return
}
// handle success here
}
或者,如果使用responseJSON
:
Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default)
.validate()
.responseJSON() { response in
switch response.result {
case .failure:
// handle errors (including `validate` errors) here
if let statusCode = response.response?.statusCode {
if statusCode == 409 {
// handle 409 specific error here, if you want
}
}
case .success(let value):
// handle success here
print(value)
}
}
以上是Alamofire 4.x.请参阅earlier versions of Alamofire的此答案的先前版本。
如果您使用validate(),您将丢失来自服务器的错误消息,如果您想保留它,请参阅此答案qazxsw poi