NSURLResponse - ¿Cómo obtener el código de estado?


85

Tengo una NSURLRequest simple:

[NSURLConnection sendAsynchronousRequest:myRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    // do stuff with response if status is 200
}];

¿Cómo obtengo el código de estado para asegurarme de que la solicitud fue correcta?


No estoy seguro, pero no es necesario que verifique el código de estado 200. Si su servidor envía otro código de estado, obtendrá un objeto de error en el controlador de finalización y podrá verificar.
Matz

5
Hay otros códigos de estado que representan resultados que no son errores, como redirecciones o no encontrados, y probablemente otros (relacionados con la autenticación, etc.) en los que no puedo pensar en la parte superior de mi cabeza
inorganik

Respuestas:


211

Lanza una instancia de NSHTTPURLResponsede la respuesta y usa su statusCodemétodo.

[NSURLConnection sendAsynchronousRequest:myRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
    NSLog(@"response status code: %ld", (long)[httpResponse statusCode]);
    // do stuff
}];

1
¿Podemos estar seguros de que esto realmente será una instancia de NSHTTPURLResponse, o vale la pena verificar con isKindOfClass:o respondsToSelector:?
Tim Arnold

@TimArnold sí, es una instancia de NSHTTPURLResponse, por lo que tiene todas las propiedades y métodos de esa clase.
inorganik

14
Como dicen los documentos :Whenever you make an HTTP request, the NSURLResponse object you get back is actually an instance of the NSHTTPURLResponse class.
Pixel Elephant

30

En Swift con iOS 9 puedes hacerlo de esta manera:

if let url = NSURL(string: requestUrl) {
    let request = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 300)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)

    let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
        if let httpResponse = response as? NSHTTPURLResponse {
            print("Status code: (\(httpResponse.statusCode))")

            // do stuff.
        }
    })

    task.resume()
}

Pregunta etiquetada con objetivo-c.
trojanfoe

5
Serían los mismos métodos y orden para el objetivo-c.
Bjarte

11

Rápido 4

let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in

    if let httpResponse = response as? HTTPURLResponse {
        print("Status Code: \(httpResponse.statusCode)")
    }

})

task.resume()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.