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?


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
}];

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()
}

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()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.