Какова правильная стратегия обработки ответов об ошибках от RestSharp?
Типичный HTTP-вызов с использованием RestSharp выглядит следующим образом:
var client = new RestClient("http://exampleapi.com");
var request = new RestRequest("someapi", Method.GET);
IRestResponse response = client.Execute(request);
Из документации по https://github.com/restsharp/RestSharp/wiki/Getting-Started:
Если возникает ошибка сетевого транспорта (сеть отключена, неудачный поиск DNS и т.д.), RestResponse.Status будет установлен на ResponseStatus.Error, иначе это будет ResponseStatus.Completed. Если API возвращает 404, ResponseStatus все равно будет выполнен. Если вам нужен доступ к возвращенному коду состояния HTTP, вы найдете его в RestResponse.StatusCode.
Далее следуют поведение ответов RestSharp:
- RestClient.Execute() никогда не будет генерировать исключение
- Если сетевой запрос завершается с ошибкой, то есть возникает условие, которое обычно приводит к исключению (например, время ожидания сети, недоступное, имя не может быть разрешено), тогда
response.ErrorException
будет заполнен некоторым типом, производным от Exception, и response.ErrorMessage
будет содержать строку сообщения об ошибке, а response.StatusCode
будет установлена на ResponseStatus.Error
, Response.Status.Aborted
, ResponseStatus.TimedOut
и т.д.
- Если сетевой запрос завершен успешно, но там есть некоторая ошибка HTTP (например, 404 не найдена, 500 ошибок сервера и т.д.), тогда
response.StatusCode
будет установлено на NotFound
и т.д., response.ErrorException
и Response.Error
будет null
и response.StatusCode
будет установлено значение 'ResponseStatus.Completed`.
Возможно, я пропустил некоторые возможные ответы, но я думаю, что существует суть.
Учитывая это, как мне определить успех ответа или неудачу? Варианты включают:
- Если
ErrorException == null
, то проверьте ответ http
- Если
response.ResponseStatus == ResponseStatus.Completed
затем проверить Response.StatusCode и в зависимости от результата, возьмите данные ответа и обработайте соответственно, если не то, что вы ожидаете
- Если в ответе HTTP есть некоторая ошибка, то в зависимости от типа проверки ошибки
ErrorException
- Подробнее...
Я не хочу переусердствовать, но я предполагаю наличие шаблона (из-за отсутствия лучшего термина) для его обработки.
Ответы
Ответ 1
Учитывая это, как мне определить успех ответа или неудачу?
Я предлагаю проверить ((int) response.StatusCode)
. Если 200 <= ((int) response.StatusCode) && ((int) response.StatusCode) < 400
, ему это удалось (для намеренно неопределенного определения успеха). В противном случае код состояния находится вне этого диапазона, или response.ErrorException
имеет что-то интересное.
Если вы ожидаете определенного кода состояния, вы можете предпринять какое-либо действие, если оно содержит другой код без ошибок. Например, если я ожидаю только 200 ответов, мне может потребоваться записать 301 ответ в качестве предупреждения, но продолжить.
См. этот ответ для немного другого подхода.
Ответ 2
Я думаю, что код ответа - это тип HttpStatusCode. поэтому вы можете получить код, как показано ниже. После этого вы знаете, как справиться с этим, я думаю.
RestResponse response = client.Execute(request);
HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;