我有一个非常简单的场景,我正在努力.我正在使用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) })
David Berry.. 67
来自Alamofire 手册:
验证
默认情况下,无论响应的内容如何,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) } }
Rob.. 14
如果使用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. 请参阅此前对Alamofire早期版本的回答.
来自Alamofire 手册:
验证
默认情况下,无论响应的内容如何,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. 请参阅此前对Alamofire早期版本的回答.
如果使用validate(),则将从服务器中释放错误消息,如果要保留它,请参见以下答案/sf/ask/17360801/