2

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

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

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

4

3 回答 3

4
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
        }
    }
}
于 2018-10-19T14:26:00.460 回答
2

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

如果要检索响应数据,则需要使用类似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 的建议删除了强制展开

于 2018-10-19T14:11:43.303 回答
0

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

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

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

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

于 2018-10-19T15:08:35.677 回答