it-swarm.com.ru

Как проверить Response.statusCode в sendSynchronousRequest на Swift

Как проверить response.statusCode в SendSynchronousRequest в Swift Код ниже:

let urlPath: String = "URL_IS_HERE"
var url: NSURL = NSURL(string: urlPath)
var request: NSURLRequest = NSURLRequest(URL: url)
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil

var error: NSErrorPointer? = nil
var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error: nil) as NSData?

до и в Задаче C мы проверяем response.statusCode С помощью этого: (long) response.statusCode, но в Swift я понятия не имею, как можно проверить статус ответа Code

41
hossein1448

вы передаете ссылку на ответ, чтобы он был заполнен, ТОГДА вы проверяете результат и приводите его к HTTPResponse, поскольку только http-ответы объявляют свойство кода состояния.

let urlPath: String = "http://www.google.de"
var url: NSURL = NSURL(string: urlPath)
var request: NSURLRequest = NSURLRequest(URL: url)
var response: NSURLResponse?

var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

if let httpResponse = response as? NSHTTPURLResponse {
    println("error \(httpResponse.statusCode)")
}

примечание: в objC вы бы также использовали тот же подход, но если вы используете квадратные скобки, компилятор не применяет приведение. Swift (будучи безопасным по типу) действительно применяет приведение всегда

67
Daij-Djan

Версия Swift 3 для ответа @GarySabo:

let url = URL(string: "https://Apple.com")!
let request = URLRequest(url: url)

let task = URLSession.shared().dataTask(with: request) {data, response, error in

    if let httpResponse = response as? HTTPURLResponse {
        print("statusCode: \(httpResponse.statusCode)")
    }

}
task.resume()
57
DazChong

Swift 3+

let dataURL = "https://myurl.com"
        var request = URLRequest(url: URL(string: dataURL)!)
        request.addValue("Bearer \(myToken)", forHTTPHeaderField: "Authorization")
        URLSession.shared.dataTask(with: request) { (data, response, error) in
            // Check if the response has an error
            if error != nil{
                print("Error \(String(describing: error))")
                return
            }

            if let httpResponse = response as? HTTPURLResponse{
                if httpResponse.statusCode == 401{
                    print("Refresh token...")
                    return
                }
            }

            // Get data success

        }.resume()
12
Dasoga

Я использую расширение для URLResponse, чтобы упростить это (Swift 3):

extension URLResponse {

    func getStatusCode() -> Int? {
        if let httpResponse = self as? HTTPURLResponse {
            return httpResponse.statusCode
        }
        return nil
    }
}
7
eskimwier

Очищено для Swift 2.0 с использованием NSURLSession

let urlPath: String = "http://www.google.de"
let url: NSURL = NSURL(string: urlPath)!
let request: NSURLRequest = NSURLRequest(URL: url)
var response: NSURLResponse?


let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) {urlData, response, reponseError in

         if let httpResponse = response as? NSHTTPURLResponse {
             print("error \(httpResponse.statusCode)")  
          }

 }
 task.resume()
 //You should not write any code after `task.resume()`
6
GarySabo

Если вы используете библиотеку Just , это будет так просто:

Just.get("URL_IS_HERE").statusCode
2
Daniel Duan

Создать расширение, чтобы проверить действительный/недействительный ответ -

extension HTTPURLResponse {
     func isResponseOK() -> Bool {
      return (200...299).contains(self.statusCode)
     }
}

Получить ответ на запрос -

let task = URLSession.shared.dataTask(with: request) { (jsonData, response, error) in

                // post result on main thread
                DispatchQueue.main.async {

                    if let response = response as? HTTPURLResponse, response.isResponseOK() {
                        // assume if we don't receive any error then its successful
                        handler(true)
                    } else {
                        handler(false)
                    }
                }

            }
            task.resume()
        }
0
Rahul