web-dev-qa-db-fra.com

Comment vérifier Response.statusCode dans sendSynchronousRequest sur Swift

Comment vérifier response.statusCode dans SendSynchronousRequest dans Swift Le code est ci-dessous:

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?

avant et en Objective C, nous vérifions response.statusCode Avec ceci: (long) response.statusCode mais Swift je ne sais pas comment vérifier le statut de la réponse Code

41
hossein1448

vous transmettez une référence à la réponse afin qu'elle soit remplie PUIS vous vérifiez le résultat et le transposez en HTTPResponse car seules les réponses http déclarent la propriété de code d'état.

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

note: dans objC, vous utiliserez également la même approche, mais si vous utilisez des crochets, le compilateur n’impose pas la conversion. Swift (étant de type sûr) applique la conversion. toujours

67
Daij-Djan

La version 3 de Swift pour @GarySabo répond:

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

J'utilise une extension à URLResponse pour simplifier celle-ci (Swift 3):

extension URLResponse {

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

Nettoyé pour Swift 2.0 en utilisant 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

Si vous utilisez la bibliothèque Just , ce serait aussi simple que:

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

Créer une extension pour vérifier les réponses valides/invalides -

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

Obtenir une réponse à la demande -

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