Alamofire regresa .Success on error Códigos de estado HTTP

Tengo un escenario bastante simple con el que estoy luchando. Estoy usando Alamofire para registrar un usuario en una API de descanso. La primera llamada para registrarse es exitosa y el usuario puede iniciar session. La segunda llamada, al tratar de registrarse con la misma dirección de correo electrónico, debería dar como resultado un código de estado HTTP 409 del server. Alamofire, sin embargo, devuelve un .Success con una request y una respuesta vacías. He probado esta API con el cartero y devuelve correctamente un 409.

¿Por qué no se devuelve Alamofire .Failure (error), donde el error tiene información de código de estado, etc.?

Aquí está la llamada que ejecuto con la misma input cada vez.

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

Desde el manual de Alamofire:

Validación

Por defecto, Alamofire trata cualquier request completa para tener éxito, independientemente del contenido de la respuesta. Llamar a validar antes de que un controller de respuestas provoque un error que se generará si la respuesta tiene un código de estado inaceptable o tipo MIME.

Puede validar manualmente el código de estado utilizando el método de validate , nuevamente, desde el manual:

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

O puede validar semi-automáticamente el código de estado y el tipo de contenido utilizando la validate sin arguments:

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

Si utiliza la response , puede verificar el parámetro NSHTTPURLResponse :

 Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default) .response { response in if response.response?.statusCode == 409 { // handle as appropriate } } 

Por defecto, los códigos de estado 4xx no se tratan como errores, pero puede usar validate para tratarlos como tal y luego doblarlos en su event handling errores más amplio:

 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, eg if response.response?.statusCode == 409 { // handle 409 here } return } // handle success here } 

O si usa 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) } } 

Lo anterior es Alamofire 4.x. Consulte la versión anterior de esta respuesta para las versiones anteriores de Alamofire .

si utiliza validate (), perderá el post de error del server, si desea mantenerlo, consulte esta respuesta https://stackoverflow.com/a/36333378/1261547