Типичный 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
- Подробнее...
Я не хочу переусердствовать, но я предполагаю наличие шаблона (из-за отсутствия лучшего термина) для его обработки.