Как обработать 500 ошибок http - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь получить доступ к телу пользовательского ответа для 500 ошибок в классе HTTPURLResponse (URLResponse) с помощью функции URLSession.shared.dataTask.Я могу иметь доступ только к statusCode и allHeaderFields, но, похоже, это не помогает.

Эквивалент в java для ex.HttpURLConnection.getErrorStream(), но я не могу найти что-то похожее в чистом swift (я хотел бы решить это без использования сторонних библиотек).

Как получить текстовый ответ на ошибку 500?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018
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 голосов
/ 19 октября 2018

Нет способа получить более подробную информацию об ошибке 500 на стороне клиента.

500 - это «Внутренняя ошибка сервера», и она намеренно расплывчата и бесполезна, поскольку раскрытие информации о причине ошибки поможетхакеры взломали сайт.

Однако вы можете получить много информации об ошибке из журнала сервера и журнала всего, что обрабатывало ваш код на стороне сервера (php и т. д.).

Если у вас есть доступ к журналам сервера и вы не видите достаточно информации, вы можете повысить уровень ведения журнала для сервера и приложения.

0 голосов
/ 19 октября 2018

Нет способа получить данные ответа из 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()

Редактировать: Удалена принудительная развертка в соответствии с предложением @ Роба

...