ios - pagina - http response
Alamofire devuelve.Success en error códigos de estado HTTP (3)
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 sesión. La segunda llamada, cuando intenta registrarse con la misma dirección de correo electrónico, debe generar un código de estado HTTP 409 desde el servidor. Alamofire, sin embargo, devuelve un .Success con una solicitud y una respuesta vacías. He probado este API con el cartero y devuelve correctamente un 409.
¿Por qué Alamofire no devuelve .Failure (error), donde el error tiene información de código de estado, etc.?
Aquí está la llamada que hago con la misma entrada 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)
})
Del manual Alamofire:
Validación
Por defecto, Alamofire trata cualquier solicitud completada para que sea exitosa, independientemente del contenido de la respuesta. Si se llama a validar antes de que un controlador de respuesta genere un error si la respuesta tiene un código de estado inaceptable o un tipo MIME.
Puede validar manualmente el código de estado usando el método de validate
, de nuevo, 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 de forma semiautomática el código de estado y el tipo de contenido usando la validate
sin argumentos:
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 usa 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
}
}
De manera predeterminada, los códigos de estado 4xx no se tratan como errores, pero puede usar validate
para tratarlos como tales y luego incluirlos en su manejo más amplio de errores:
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
}
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. Vea la versión anterior de esta respuesta para las versiones anteriores de Alamofire .
si usa validate () perderá el mensaje de error del servidor; si desea conservarlo, consulte esta respuesta https://.com/a/36333378/1261547