Me gustaría recuperar la respuesta HTTP de código de estado (por ejemplo, 400, 401, 403, 503, etc) para la solicitud de fallos (e idealmente por los éxitos demasiado). En este código, estoy realizando usuario de autenticación HTTP Básica y desea ser capaz de mensaje al usuario de que ha fallado la autenticación cuando el usuario mistypes 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")
}

Por desgracia, el error producido no parecen indicar que un código de estado HTTP 409 fue recibido:

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 se produce un error debido a mi lado servidor va a poner una descripción textual del error hay.

Preguntas

Es posible recuperar el código de estado sobre un no-2xx respuesta?

Es posible recuperar el código de estado específicos sobre un 2xx respuesta?

Es posible recuperar el cuerpo HTTP a un no-2xx respuesta?

Gracias!

  • Si no autenticado recibe un -999 por diseño. No sé por qué esto es o cómo se puede solucionar… ¿la solución?
InformationsquelleAutor GregT | 2015-03-18

9 Comentarios

  1. 167

    Para Swift 3.x /Swift 4.0 /Swift 5.0 usuarios con Alamofire >= 4.0 /Alamofire >= 5.0


    response.response?.statusCode

    Más detallado ejemplo:

    Alamofire.request(urlString)
    .responseString { response in
    print("Success: \(response.result.isSuccess)")
    print("Response String: \(response.result.value)")
    var statusCode = response.response?.statusCode
    if let error = response.result.error as? AFError {  
    statusCode = error._code //statusCode private                 
                    switch error {
    case .invalidURL(let url):
    print("Invalid URL: \(url) - \(error.localizedDescription)")
    case .parameterEncodingFailed(let reason):
    print("Parameter encoding failed: \(error.localizedDescription)")
    print("Failure Reason: \(reason)")
    case .multipartEncodingFailed(let reason):
    print("Multipart encoding failed: \(error.localizedDescription)")
    print("Failure Reason: \(reason)")
    case .responseValidationFailed(let reason):
    print("Response validation failed: \(error.localizedDescription)")
    print("Failure Reason: \(reason)")
    switch reason {
    case .dataFileNil, .dataFileReadFailed:
    print("Downloaded file could not be read")
    case .missingContentType(let acceptableContentTypes):
    print("Content Type Missing: \(acceptableContentTypes)")
    case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
    print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
    case .unacceptableStatusCode(let code):
    print("Response status code was unacceptable: \(code)")
    statusCode = code
    }
    case .responseSerializationFailed(let reason):
    print("Response serialization failed: \(error.localizedDescription)")
    print("Failure Reason: \(reason)")
    //statusCode = 3840 ???? maybe..
                    default:break
    }
    print("Underlying error: \(error.underlyingError)")
    } else if let error = response.result.error as? URLError {
    print("URLError occurred: \(error)")
    } else {
    print("Unknown error: \(response.result.error)")
    }
    print(statusCode) //the status code
        } 

    (Alamofire 4 contiene un completamente nuevo error de sistema, buscar aquí para más detalles)

    Para Swift 2.x usuarios con Alamofire >= 3.0

    Alamofire.request(.GET, urlString)
    .responseString { response in
    print("Success: \(response.result.isSuccess)")
    print("Response String: \(response.result.value)")
    if let alamoError = response.result.error {
    let alamoCode = alamoError.code
    let statusCode = (response.response?.statusCode)!
    } else { //no errors
                   let statusCode = (response.response?.statusCode)! //example : 200
                 }
    }
    • respuesta.resultado.el error puede dar una Alamofire de error, por ejemplo. StatusCodeValidationFailed, FAILURE: Error Domain=com.alamofire.error Code=-6003. Es si usted realmente desea obtener respuesta HTTP error es mejor para el usuario response.response?.statusCode
    • Estoy de acuerdo con usted, usted ha hecho una correcta aclaración. He actualizado mi respuesta para mayor claridad
  2. 47

    En el controlador de finalización con el argumento de response a continuación puedo encontrar el código de estado http en response.response.statusCode:

    Alamofire.request(.POST, urlString, parameters: parameters)
    .responseJSON(completionHandler: {response in
    switch(response.result) {
    case .Success(let JSON):
    //Yeah! Hand response
                    case .Failure(let error):
    let message : String
    if let httpStatusCode = response.response?.statusCode {
    switch(httpStatusCode) {
    case 400:
    message = "Username or password not provided."
    case 401:
    message = "Incorrect password for user '\(name)'."
    ...
    }
    } else {
    message = error.localizedDescription
    }
    //display alert with error message
                     }
    • Por último, un ejemplo válido!!! Muchas, muchas, muchas gracias!
    • Hola, le código de estado 200 caen bajo el fracaso? mi petición fue manejado correctamente en el lado del servidor, pero la respuesta se cae en el Fracaso
    • No creo que 200 es un error de http : consulte stackoverflow.com/questions/27921537/…
    • el código de estado 200 es lo que indica el éxito, si el servidor devuelve 200 y la respuesta que indica el error (que yo.e en algunos propiedad llamada issuccess = falso), entonces usted tiene que controlar que en su interfaz de código
  3. 15
        Alamofire
    .request(.GET, "REQUEST_URL", parameters: parms, headers: headers)
    .validate(statusCode: 200..<300)
    .responseJSON{ response in
    switch response.result{
    case .Success:
    if let JSON = response.result.value
    {
    }
    case .Failure(let error):
    }
    • Esto estimula la api de mejores prácticas
    • URW 🙂 Tratar de implementar Router para sus solicitudes. 😉
  4. 8

    Mejor manera de obtener el código de estado mediante alamofire.

     Alamofire.petición(URL).responseJSON { 
    respuesta en 
    vamos status = respuesta.respuesta?.statusCode 
    print("ESTADO de \(estado)") 
    } 
    
    • Excat lo que yo quiero. Gracias
    • impresionante @KamalTrivedi
  5. 5

    En su responseJSON completado, usted puede obtener el código de estado de la respuesta del objeto, que tiene un tipo de NSHTTPURLResponse?:

    if let response = res {
    var statusCode = response.statusCode
    }

    Esto funcionará independientemente de si el código de estado es en el rango de error. Para obtener más información, echa un vistazo a la NSHTTPURLResponse documentación.

    Para tu otra pregunta, puede utilizar el responseString función para obtener la cruda respuesta del cuerpo. Usted puede agregar esto en adición a responseJSON y ambos serán llamados.

    .responseJson { (req, res, json, error) in
    //existing code
    }
    .responseString { (_, _, body, _) in
    //body is a String? containing the response body
    }
  6. 3

    Su error indica que la operación se cancela por alguna razón. Me haría falta más detalles para entender por qué. Pero creo que el mayor problema puede ser que, desde su extremo https://host.com/a/path es falso, no hay respuesta del servidor de informes, y por lo tanto usted está viendo nil.

    Si usted golpea una válida extremo de que sirve una respuesta adecuada, usted debe ver a un no-valor nil para res (utilizando las técnicas de Sam menciona) en la forma de un NSURLHTTPResponse objeto con propiedades como el statusCode, etc.

    También, sólo para ser claros, error es de tipo NSError. Se le explica el motivo de la solicitud de red fallado. El código de estado de la falla en el lado del servidor es en realidad una parte de la respuesta.

    Esperanza de que ayuda a responder a su pregunta principal.

    • Buena captura, estaba demasiado centrado en la lista de preguntas en la parte inferior.
    • Su realidad está recibiendo un código 401 no autorizado porque soy intencionalmente el envío de la contraseña incorrecta para simular un usuario cometer errores al escribir su contraseña para que yo pueda coger ese caso y dar la retroalimentación de los usuarios. Eso no es la URL real que estoy usando, pero yo estoy usando una de fiar URL que se traduce en éxito cuando me envíen la contraseña correcta. La salida de la consola en mi post original es de salida real de golpear a una URL real (salvo que la dirección URL es falso) y se puede ver que el res objeto es nil, por lo que esta respuesta no ayuda, lo siento.
    • Gracias por aclarar. Bien, entonces la única cosa que sospechan que aquí es el -999 error no he encontrado, pero la documentación sugiere que la solicitud ha sido cancelado (por lo que la pregunta de incluso recibir una respuesta debería ser discutible). ¿Has probado a imprimir el objeto de respuesta para un diferente tipo de error que no relacionadas con auth? Sólo por curiosidad.
    • ahhhh yo pensaba error se estaba refiriendo a las respuestas con los códigos de estado que están fuera de la gama que ofrecemos para validate(). Gracias!!!
  7. 2

    O el uso de la coincidencia de patrón

    if let error = response.result.error as? AFError {
    if case .responseValidationFailed(.unacceptableStatusCode(let code)) = error {
    print(code)
    }
    }
    • Trabajó como un encanto.
  8. 2

    puede consultar el siguiente código para el código de estado controlador alamofire

        let request = URLRequest(url: URL(string:"url string")!)    
    Alamofire.request(request).validate(statusCode: 200..<300).responseJSON { (response) in
    switch response.result {
    case .success(let data as [String:Any]):
    completion(true,data)
    case .failure(let err):
    print(err.localizedDescription)
    completion(false,err)
    default:
    completion(false,nil)
    }
    }

    si el código de estado es no validar será entrar en el fracaso, en el caso del switch

  9. 1

    Para Swift 2.0 los usuarios con Alamofire > 2.0

    Alamofire.request(.GET, url)
    .responseString { _, response, result in
    if response?.statusCode == 200{
    //Do something with result
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here