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?

inorgánico
fuente
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
}];
inorgánico
fuente
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()
}
Bjarte
fuente
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()
Haroldo Gondim
fuente