【问题标题】:How To Check Response.statusCode in sendSynchronousRequest on Swift如何在 Swift 上的 sendSynchronousRequest 中检查 Response.statusCode
【发布时间】:2014-10-04 09:18:04
【问题描述】:

如何在 Swift 中检查 SendSynchronousRequest 中的 response.statusCode 代码如下:

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 但很快我不知道如何检查响应状态代码

【问题讨论】:

    标签: ios swift nsurlconnection nsurlrequest


    【解决方案1】:

    您传入对响应的引用,因此它被填充然后您检查结果并将其转换为 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(类型安全)总是强制强制转换

    【讨论】:

    • 您可以将iflet 语句组合/简化为if let httpResponse = response as? NSHTTPURLResponse { ... }
    • yip right 我不习惯 if let 构造,但它更干净! -- 已编辑
    • 您的答案中以 NS 开头的所有类型现在都已删除 NS。 NSHTTPURLResponse -> HTTPURLResponse 这是给未来程序员的注意事项。
    【解决方案2】:

    @GarySabo 的 Swift 3 版本回答:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我使用 URLResponse 的扩展来简化这个(Swift 3):

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

        【讨论】:

        • 你如何使用它?一个例子会很好
        • 用法:if let statusCode = urlResponse.getStatusCode() { /*...*/ }
        【解决方案5】:

        使用 NSURLSession 为 Swift 2.0 清理

        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】:

          创建扩展以检查有效/无效响应 -

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

          【讨论】:

            【解决方案7】:

            对于带有await的Swift 5.5

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

            【讨论】:

              【解决方案8】:

              如果您使用 Just 库,它会很简单:

              Just.get("URL_IS_HERE").statusCode
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-02-10
                • 1970-01-01
                • 1970-01-01
                • 2015-03-20
                • 2019-03-12
                相关资源
                最近更新 更多