Typowe połączenia HTTP z wykorzystaniem RestSharp wygląda następująco:Jaka jest właściwa strategia obsługi odpowiedzi na błędy z RestSharp?
var client = new RestClient("http://exampleapi.com");
var request = new RestRequest("someapi", Method.GET);
IRestResponse response = client.Execute(request);
Z dokumentacji na https://github.com/restsharp/RestSharp/wiki/Getting-Started:
Jeśli wystąpi błąd Sieci Transportowej (sieć jest w dół, nie powiodło się wyszukiwanie DNS, itp), RestResponse.Status zostanie ustawiony na ResponseStatus.Error, w przeciwnym razie będzie to ResponseStatus.Completed. Jeśli interfejs API zwróci wartość 404, parametr ResponseStatus będzie nadal ukończony. Jeśli potrzebujesz dostępu do zwróconego kodu statusu HTTP, znajdziesz go w RestResponse.StatusCode.
Ponadto, wydaje się być następujące zachowania odpowiedzi RestSharp:
- RestClient.Execute() nigdy nie będzie wyjątek
- Jeżeli wniosek sieć zawiedzie, czyli warunek, że wystąpi zwykle powoduje wyjątek (np. przekroczono limit czasu sieci, nieosiągalny, nazwa nie może zostać rozstrzygnięta), a następnie
response.ErrorException
zostanie wypełniony typem pochodzącym od wyjątku, aresponse.ErrorMessage
będzie zawierał komunikat o błędzie komunikatu, aresponse.StatusCode
zostanie ustawiony naResponseStatus.Error
,Response.Status.Aborted
,ResponseStatus.TimedOut
itp - Jeśli żądanie sieci powiedzie się, ale istnieje jakiś błąd HTTP (np 404 nie znaleziono, błąd serwera 500, itd.), A następnie
response.StatusCode
zostanie ustawiona naNotFound
, itpResponse.ErrorException
iResponse.Error
będzienull
iresponse.StatusCode
zostaną ustawione na "ResponseStatus.Completed".
Możliwe, że przegapiłem kilka możliwych odpowiedzi, ale myślę, że sedno tam jest.
Biorąc pod uwagę to, w jaki sposób powinienem określić odpowiedź lub porażkę? Dostępne są następujące opcje:
- Jeśli
ErrorException == null
następnie sprawdzić odpowiedzi HTTP - Jeśli
response.ResponseStatus == ResponseStatus.Completed
następnie sprawdzić Response.StatusCode iw zależności od wyniku, chwyć danych odpowiedzi i odpowiednio obsłużyć jeśli nie, czego oczekujesz - Jeśli http odpowiedź jest pewnym błędem, a następnie zależnie od typu sprawdzania błędu:
ErrorException
- Więcej ...?
Nie chcę przemyślenia tego, ale zakładam, że istnieje wzór (z braku lepszego terminu) do obsługi tego w sposób czysty.