2014-10-04 11 views
32

Come controllare response.statusCode in SendSynchronousRequest a Swift Il Codice è qui sotto:Come controllare Response.statusCode in sendSynchronousRequest su 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? 

prima e in Objective C, controlliamo response.statusCode Con questa: (lungo) response.statusCode ma in rapida non ho idea di come può controllare il codice di stato di risposta

risposta

51

si passa in un riferimento alla risposta in modo da riempirla ALLORA si controlla il risultato e lanci ad una HTTPResponse come solo http le risposte dichiarano la proprietà del codice di stato.

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

nota: in objc si dovrebbe anche usare lo stesso approccio, ma se si utilizza parentesi quadre, il compilatore non far rispettare il cast. Swift (essere sicuro tipo) fa valere il cast sempre

+0

È possibile combinare/semplificare il '' if' e dichiarazioni let' a 'se lasciare HttpResponse = risposta come? NSHTTPURLResponse {...} '. –

+0

yip right Non sono così abituato al costrutto se lasciato ma è più pulito! - modificato –

+0

Grazie! funziona perfettamente. – Raja

1

Se si utilizza la libreria Just sarebbe semplice come:

Just.get("URL_IS_HERE").statusCode 
6

ripulito per Swift 2.0 utilizzando 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()` 
36

Swift 3 versione per @GarySabo risposta:

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

io uso un n estensione a URLResponse a semplificare questo (Swift 3):

extension URLResponse { 

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

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() 
Problemi correlati