How To Check Response.statusCode in sendSynchronousRequest on Swift

How To check response.statusCode in SendSynchronousRequest in Swift The Code is Below :

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?

before and in objective c , we check response.statusCode With this : (long)response.statusCode but in swift i have no idea how can check response status Code

83571 次浏览

you pass in a reference to response so it is filled THEN you check the result and cast it to a HTTPResponse as only http responses declare the status code property.

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: in objC you would also use the same approach but if you use squared brackets, the compiler doesn't enforce the cast. Swift (being type safe) does enforce the cast always

If you use the Just library it'd be as simple as:

Just.get("URL_IS_HERE").statusCode

Cleaned up for Swift 2.0 using 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()`

Swift 3 version for @GarySabo answer:

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

I use an extension to URLResponse to simplify this one (Swift 3):

extension URLResponse {


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

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

Create extension to check valid/invalid response -

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

Get response from request -

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

For Swift 5.5 with await

        let (data, response) = try await URLSession.shared.data(for: request)


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


throw(Error.invalidHttpResponseCode)
}

Swift 5.7 You can try this on the playground:

import Foundation
import PlaygroundSupport


let url = URL(string: "http://stackoverflow.com")!


URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print(error ?? "Unknown error")
return
}
if let httpResponse = response as? HTTPURLResponse {
print("statusCode: \(httpResponse.statusCode)")
}
let contents = String(data: data, encoding: .utf8)
print(contents!)
}.resume()


PlaygroundPage.current.needsIndefiniteExecution = true