para pagina estado error códigos codigos code ios swift alamofire

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