How To Check Response.statusCode in sendSynchronousRequest on Swift

IosSwiftNsurlconnectionNsurlrequest

Ios Problem Overview


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

Ios Solutions


Solution 1 - Ios

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

Solution 2 - Ios

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

Solution 3 - Ios

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

Solution 4 - Ios

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

Solution 5 - Ios

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

Solution 6 - Ios

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

Solution 7 - Ios

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

Solution 8 - Ios

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

Just.get("URL_IS_HERE").statusCode

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionhossein1448View Question on Stackoverflow
Solution 1 - IosDaij-DjanView Answer on Stackoverflow
Solution 2 - IosDazChongView Answer on Stackoverflow
Solution 3 - IosDasogaView Answer on Stackoverflow
Solution 4 - IoseskimwierView Answer on Stackoverflow
Solution 5 - IosRahulView Answer on Stackoverflow
Solution 6 - IosGarySaboView Answer on Stackoverflow
Solution 7 - IosBill ChanView Answer on Stackoverflow
Solution 8 - IosDaniel DuanView Answer on Stackoverflow