【问题标题】:How to handle 500 http errors如何处理 500 个 http 错误
【发布时间】:2019-03-24 10:28:13
【问题描述】:

我正在尝试使用 URLSession.shared.dataTask 函数访问自定义服务器响应正文以查找类 HTTPURLResponse (URLResponse) 中的 500 个错误。我只能访问statusCodeallHeaderFields,但这似乎没有帮助。

java 中的等价物 for ex。是 HttpURLConnection.getErrorStream(),但我在纯 swift 中找不到类似的东西(我想在不使用 3rd 方库的情况下解决这个问题)。

如何获取 500 错误的文本响应?

【问题讨论】:

  • 你不能。 500 是服务器错误,它可能会以任何形式向您发送响应。
  • 这因实施而异。许多 Web 服务返回带有这些状态代码的结构化或明确定义的响应,您可以从第一个参数 Data 对象中解析响应,并传递回 dataTask 完成处理程序闭包。但是,500 个代码通常被视为未处理的错误,并且出于安全原因,您通常不会在响应中(至少在生产环境中)公开诊断信息,并且大多数实现不会在此处公开任何有意义的细节,而是您会改为参考内部系统日志。

标签: swift httpresponse nsurlsession foundation nshttpurlresponse


【解决方案1】:

您无法从HTTPURLResponse 中获取响应数据。它只包含头信息。

如果您想检索响应数据,您需要使用 dataTask(with:completionHandler:) 之类的东西来发送您的请求。该函数将(Data?, URLResponse?, Error?) 传递给您的完成处理程序。完成处理程序的data参数是服务器返回的数据。

例如:

import Foundation

let url = URL(string: "http://httpstat.us/500")!

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    guard let data = data, let response = response as? HTTPURLResponse else {
        return
    }

    switch response.statusCode {
    case 500...599:
        print(String(data: data, encoding: .utf8) ?? "No UTF-8 response data")
    default:
        print("not a 500")
    }
}

task.resume()

编辑:根据@Rob 的建议删除了强制展开

【讨论】:

    【解决方案2】:
    let task = session.dataTask(with: urlRequest) { data, response, error in
        if let data = data, let response = response as? HTTPURLResponse {
            switch response.statusCode {
            case 500...599:
                let yourErrorResponseString = String(data: data, encoding: .utf8)
            default:
                break
            }
        }
    }
    

    【讨论】:

    • 我使用了调试器,它显示数据有 0 个字节,所以我认为我的代码有问题。这行得通,谢谢!
    【解决方案3】:

    无法从客户端获取有关 500 错误的更多详细信息。

    500 是“内部服务器错误”,它故意含糊不清且无益,因为披露有关错误原因的信息会帮助黑客入侵网站。

    但是,您可以从服务器日志和任何在服务器端处理您的代码(php 等)的日志中获得有关错误的大量信息。

    如果您有权访问服务器日志但没有看到足够的信息,您可以提高服务器和应用程序的日志记录级别。

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多