Какова правильная стратегия обработки ответов об ошибках от 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;