2015-12-26 13 views
12

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, a response.ErrorMessage będzie zawierał komunikat o błędzie komunikatu, a response.StatusCode zostanie ustawiony na ResponseStatus.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 na NotFound, itp Response.ErrorException i Response.Error będzie null i response.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.

Odpowiedz

0

Myślę, że kod odpowiedzi jest typem HttpStatusCode. więc możesz uzyskać kod jak poniżej. Potem już wiesz, jak sobie z tym poradzić.

RestResponse response = client.Execute(request); 
HttpStatusCode statusCode = response.StatusCode; 
int numericStatusCode = (int)statusCode; 
1

Biorąc pod uwagę to, w jaki sposób należy określić sukces lub niepowodzenie odpowiedzi?

Proponuję sprawdzić ((int) response.StatusCode). Jeśli 200 <= ((int) response.StatusCode) && ((int) response.StatusCode) < 400, udało się (z celowo niejasną definicją sukcesu).W przeciwnym razie kod stanu znajduje się poza tym zakresem lub response.ErrorException ma coś interesującego.

Jeśli spodziewasz się określonego kodu statusu, możesz podjąć działanie, jeśli jest to inny, inny niż błąd kod. Na przykład, jeśli spodziewam się tylko 200 odpowiedzi, mogę chcieć zarejestrować odpowiedź 301 jako ostrzeżenie, ale kontynuować.

Zobacz nieco inne podejście, patrz: this answer.

Powiązane problemy