NSURLResponse - Làm thế nào để lấy mã trạng thái?


85

Tôi có một NSURLRequest đơn giản:

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

Làm cách nào để lấy mã trạng thái để đảm bảo rằng yêu cầu vẫn ổn?


Tôi không chắc, nhưng bạn không cần phải kiểm tra mã trạng thái 200. Nếu máy chủ của bạn gửi một mã trạng thái khác, bạn sẽ nhận được một đối tượng lỗi trong CompleteHandler và có thể kiểm tra.
Matz

5
Có những mã trạng thái khác thể hiện kết quả không có lỗi, như chuyển hướng hoặc không phải founds và có thể là những mã khác (liên quan đến xác thực, v.v.) mà tôi không thể nghĩ ra
inorganik

Câu trả lời:


211

Truyền một phiên bản của NSHTTPURLResponsephản hồi và sử dụng statusCodephương thức của nó .

[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
Chúng ta có thể chắc chắn rằng đây thực sự là một ví dụ của NSHTTPURLResponse, hoặc nó có đáng để kiểm tra với isKindOfClass:hoặc respondsToSelector:không?
Tim Arnold

@TimArnold vâng, nó là một phiên bản của NSHTTPURLResponse, vì vậy nó có tất cả các thuộc tính và phương thức của lớp đó.
inorganik

14
Như các tài liệu nói:Whenever you make an HTTP request, the NSURLResponse object you get back is actually an instance of the NSHTTPURLResponse class.
Pixel Elephant:

30

Trong Swift với iOS 9, bạn có thể thực hiện theo cách này:

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

Câu hỏi được gắn thẻ mục tiêu-c.
trojanfoe

5
Nó sẽ là cùng một phương pháp và thứ tự cho mục tiêu-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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.