NSURLResponse - Як отримати код стану?


85

У мене є простий NSURLRequest:

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

Як отримати код стану, щоб переконатися, що запит відповідає?


Я не впевнений, але вам не потрібно перевіряти код стану 200. Якщо ваш сервер надсилає інший код стану, ви отримаєте об'єкт помилки в compleHandler і можете перевірити.
Мац,

5
Є й інші коди стану, які представляють результати, що не є помилками, наприклад, переспрямування чи не знаходження, і, можливо, інші (пов’язані з автентифікацією тощо), про які я не можу згадати з голови
inorganik

Відповіді:


211

Викиньте екземпляр NSHTTPURLResponseз відповіді та використовуйте його statusCodeметод.

[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
Чи можемо ми бути впевнені, що це справді буде екземпляром NSHTTPURLResponse, чи варто це перевірити з isKindOfClass:або respondsToSelector:?
Тім Арнольд

@TimArnold так, це екземпляр NSHTTPURLResponse, тому він має всі властивості та методи цього класу.
inorganik

14
Як сказано в документах :Whenever you make an HTTP request, the NSURLResponse object you get back is actually an instance of the NSHTTPURLResponse class.
Pixel Elephant

30

У Swift з iOS 9 ви можете зробити це таким чином:

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

Питання з позначкою цель-с.
trojanfoe

5
Це були б ті самі методи та порядок для мети-с.
Bjarte

11

Стрімкий 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.