NSURLResponse - Como obter o código de status?

86

Eu tenho um NSURLRequest simples:

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

Como obtenho o código de status para ter certeza de que a solicitação foi ok?

inorganik
fonte
Não tenho certeza, mas você não precisa verificar o código de status 200. Se o seu servidor enviar outro código de status, você obterá um objeto de erro no completeHandler e poderá verificar.
Matz
5
Existem outros códigos de status que representam resultados que não são erros, como redirecionamentos ou não encontrados, e provavelmente outros (relacionados à autenticação, etc.) que não consigo pensar de cara
inorganik

Respostas:

212

Converta uma instância de NSHTTPURLResponseda resposta e use seu 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
}];
inorganik
fonte
1
Podemos ter certeza de que isso realmente será uma instância de NSHTTPURLResponseou vale a pena verificar com isKindOfClass:ou respondsToSelector:?
Tim Arnold
@TimArnold sim, é uma instância de NSHTTPURLResponse, portanto, possui todas as propriedades e métodos dessa classe.
inorganik
14
Como dizem os documentos :Whenever you make an HTTP request, the NSURLResponse object you get back is actually an instance of the NSHTTPURLResponse class.
Pixel Elephant
30

No Swift com iOS 9, você pode fazer isso desta maneira:

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
fonte
Pergunta marcada com objetivo-c.
trojanfoe
5
Seriam os mesmos métodos e ordem para o objetivo-c.
Bjarte
11

Swift 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
fonte