如何处理 500 个 http 错误

How to handle 500 http errors

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

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

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

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

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

例如:

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 的建议删除了强制展开

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

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

500 是 "Internal Server Error",它故意含糊不清且无用,因为披露有关错误原因的信息会帮助黑客破坏网站。

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

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