Me gustaría recuperar el código de estado de respuesta HTTP (por ejemplo, 400, 401, 403, 503, etc.) en caso de fallas en las solicitudes (e idealmente también para los éxitos). En este código, estoy realizando la autenticación de usuario con HTTP Basic y quiero poder enviar un mensaje al usuario de que la autenticación falló cuando el usuario escribe mal su contraseña.
Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
.responseString { (req, res, data, error) in
if error != nil {
println("STRING Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for String")
}
.responseJSON { (req, res, data, error) in
if error != nil {
println("JSON Error:: error:\(error)")
println(" req:\(req)")
println(" res:\(res)")
println(" data:\(data)")
return
}
println("SUCCESS for JSON")
}
Desafortunadamente, el error producido no parece indicar que se haya recibido realmente un código de estado HTTP 409:
STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
res:nil
data:nil
Además, sería bueno recuperar el cuerpo HTTP cuando ocurre un error porque mi servidor pondrá una descripción textual del error allí.
Preguntas
¿Es posible recuperar el código de estado con una respuesta que no sea 2xx?
¿Es posible recuperar el código de estado específico con una respuesta 2xx?
¿Es posible recuperar el cuerpo HTTP en una respuesta que no sea 2xx?
¡Gracias!
Respuestas:
Para usuarios de Swift 3.x / Swift 4.0 / Swift 5.0 con Alamofire> = 4.0 / Alamofire> = 5.0
Ejemplo más detallado:
(Alamofire 4 contiene un sistema de error completamente nuevo, busque aquí para más detalles)
Para usuarios de Swift 2.x con Alamofire> = 3.0
fuente
StatusCodeValidationFailed
,FAILURE: Error Domain=com.alamofire.error Code=-6003
. Si realmente desea obtener un error de respuesta HTTP, es mejor para el usuarioresponse.response?.statusCode
En el controlador de finalización con el argumento a
response
continuación, encuentro que el código de estado http está enresponse.response.statusCode
:fuente
fuente
La mejor forma de obtener el código de estado usando alamofire.
fuente
Al
responseJSON
finalizar, puede obtener el código de estado del objeto de respuesta, que tiene un tipo deNSHTTPURLResponse?
:Esto funcionará independientemente de si el código de estado se encuentra en el rango de error. Para obtener más información, consulte la documentación de NSHTTPURLResponse .
Para su otra pregunta, puede usar la
responseString
función para obtener el cuerpo de respuesta sin procesar. Puede agregar esto además deresponseJSON
y ambos serán llamados.fuente
Su error indica que la operación se está cancelando por algún motivo. Necesitaría más detalles para entender por qué. Pero creo que el problema más grande puede ser que, dado que su punto final
https://host.com/a/path
es falso, no hay una respuesta real del servidor para informar y, por lo tanto, está viendonil
.Si llega a un punto final válido que ofrece una respuesta adecuada, debería ver un valor no nulo para
res
(usando las técnicas que Sam menciona) en forma de unNSURLHTTPResponse
objeto con propiedades comostatusCode
, etc.Además, para que quede claro,
error
es de tipoNSError
. Le dice por qué falló la solicitud de red. El código de estado del error en el lado del servidor es en realidad parte de la respuesta.Espero que ayude a responder su pregunta principal.
fuente
res
objeto lo esnil
, por lo que esta respuesta no ayuda, lo siento.error
se refería a respuestas con códigos de estado que están fuera del rango que proporcionamosvalidate()
. ¡¡¡Gracias!!!O usa la coincidencia de patrones
fuente
puede consultar el siguiente código para el controlador de código de estado de alamofire
si el código de estado no es validado, se ingresará la falla en el caso del interruptor
fuente
Para usuarios de Swift 2.0 con Alamofire> 2.0
fuente
Necesitaba saber cómo obtener el número de código de error real.
Heredé un proyecto de otra persona y tuve que obtener los códigos de error de una
.catch
cláusula que habían configurado previamente para Alamofire:O si necesita obtenerlo del
response
valor, siga la respuesta de @ mbryzinskifuente