NSURLResponse - Come ottenere il codice di stato?


86

Ho una semplice NSURLRequest:

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

Come ottengo il codice di stato per assicurarmi che la richiesta sia stata corretta?


Non ne sono sicuro, ma non è necessario controllare il codice di stato 200. Se il tuo server invia un altro codice di stato, riceverai un oggetto di errore nel completamentoHandler e potrai controllare.
Matz

5
Ci sono altri codici di stato che rappresentano risultati che non sono errori, come reindirizzamenti o non trovati, e probabilmente altri (correlati all'autenticazione, ecc.) A cui non riesco a pensare a prima vista
inorganik

Risposte:


212

Lancia un'istanza di NSHTTPURLResponsedalla risposta e usa il suo statusCodemetodo.

[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
Possiamo essere sicuri che questo sarà davvero un esempio di NSHTTPURLResponse, o vale la pena controllare con isKindOfClass:o respondsToSelector:?
Tim Arnold

@TimArnold sì, è un'istanza di NSHTTPURLResponse, quindi ha tutte le proprietà e i metodi di quella classe.
inorganik

14
Come dicono i documenti :Whenever you make an HTTP request, the NSURLResponse object you get back is actually an instance of the NSHTTPURLResponse class.
Pixel Elephant

30

In Swift con iOS 9 puoi farlo in questo modo:

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

Domanda contrassegnata con obiettivo-c.
trojanfoe

5
Sarebbe lo stesso metodo e ordine per l'obiettivo-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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.