Korzystanie z usługi REST z klientem HttpClient
Wiele nowoczesnych usług internetowych implementuje architekturę REST. Ta struktura umożliwia usłudze internetowej uwidacznienie operacji i danych za pośrednictwem serii dobrze zdefiniowanych punktów końcowych. Żądania wysyłane przez aplikacje klienckie do usługi internetowej REST w celu pobierania, modyfikowania lub tworzenia lub usuwania danych używają wstępnie zdefiniowanego zestawu zleceń. Usługa internetowa REST odpowiada na te żądania w standardowy sposób. Takie podejście ułatwia konstruowanie aplikacji klienckich.
Model REST jest oparty na protokole HTTP. Aplikacja .NET MAUI może wysyłać żądania do usługi internetowej REST przy użyciu HttpClient
klasy . W tej lekcji dowiesz się HttpClient
, jak używać jej do interakcji z usługą internetową REST.
Co to jest klasa HttpClient?
HttpClient
to klasa platformy .NET, za pomocą którego aplikacja może wysyłać żądania HTTP i odbierać odpowiedzi HTTP z usługi internetowej REST. Zestaw identyfikatorów URI identyfikuje zasoby udostępniane przez usługę internetową. Identyfikator URI łączy adres usługi internetowej z nazwą zasobu dostępnego pod tym adresem.
Klasa HttpClient
używa interfejsu API opartego na zadaniach na potrzeby wydajności i zapewnia dostęp do informacji w komunikatach żądań, takich jak nagłówki HTTP i kody stanu, a także treści komunikatów, które zawierają rzeczywiste dane wysyłane i odbierane.
Klasa HttpClient
jest dostępna w System.Net.Http
przestrzeni nazw. Aplikacja może utworzyć HttpClient
obiekt przy użyciu konstruktora domyślnego:
using System.Net.Http;
...
var client = new HttpClient();
Wykonywanie operacji CRUD za pomocą obiektu HttpClient
Usługa internetowa REST umożliwia klientowi wykonywanie operacji względem danych za pomocą zestawu zleceń HTTP. Zadanie czasownika HTTP polega na wskazaniu żądanej akcji do wykonania w zasobie. Istnieje wiele zleceń HTTP, ale cztery najczęściej są to POST
, GET
, PUT
i DELETE
. Usługa może zaimplementować te czasowniki, aby umożliwić aplikacji klienckiej zarządzanie cyklem życia obiektów, wykonując operacje tworzenia, odczytu, aktualizacji i usuwania (CRUD) w następujący sposób:
Czasownik
POST
wskazuje, że chcesz utworzyć nowy zasób.Czasownik
GET
wskazuje, że chcesz pobrać zasób.Czasownik
PUT
wskazuje, że chcesz zaktualizować zasób.Czasownik
DELETE
wskazuje, że chcesz usunąć zasób.
Tworzenie nowego zasobu za pomocą klienta HttpClient
Aby utworzyć nowy zasób przy użyciu metody HttpClient
, możesz użyć SendAsync
metody przekazującej HttpRequestMessage
go do obiektu.
Element HttpRequestMessage
jest przeznaczony do modelowania żądania wysyłanego do usługi internetowej. Należy określić czasownik HTTP, adres URL usługi internetowej i wypełnić dowolny ładunek do wysłania HttpRequestMessage.Content
za pośrednictwem właściwości .
HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url);
message.Content = JsonContent.Create<Part>(part);
HttpResponseMessage response = await client.SendAsync(message);
Ten fragment kodu wykonuje następujące zadania:
- Tworzy wystąpienie wywoływanego
HttpClient
klienta , którego używa do wysyłania komunikatu. - Tworzy wystąpienie o nazwie komunikatu
HttpRequestMessage
, którego używa do modelowania komunikatu. Komunikat ma czasownik HTTP i adres URL. - Ustawia
Content
właściwośćHttpRequestMessage
, używającJsonContent.Create
funkcji . Ta funkcja automatycznie serializuje zmienną części w formacie JSON odpowiednią do wysyłania do usługi internetowej. - Wysyła komunikat przy użyciu
HttpClient
obiektu . ZwracanyHttpResponseMessage
jest element zawierający informacje, takie jak kod stanu i informacje zwracane przez usługę internetową.
Odczytywanie zasobu za pomocą obiektu HttpClient
Zasób z usługi internetowej można odczytać przy użyciu tej samej techniki, co wcześniej opisane, z wyjątkiem inicjowania elementu HttpRequestMessage
za pomocą elementu HttpMethod.Get
. Ma HttpClient
jednak kilka metod wygody, które udostępniają skróty.
Aby odczytać zasób przy użyciu metody HTTPClient
, użyj GetStringAsync
metody , jak pokazano w następnym przykładzie:
HttpClient client = new HttpClient();
string text = await client.GetStringAsync("https://...");
Metoda GetStringAsync
przyjmuje identyfikator URI, który odwołuje się do zasobu i zwraca odpowiedź jako ciąg. Odpowiedź ciągu to zasób żądany przez aplikację. Format danych odpowiedzi jest domyślny dla żądanej usługi, takiej jak JSON lub XML. Aplikacja może poinformować usługę internetową, że wymaga zwrócenia danych w określonym formacie przez dodanie nagłówka MediaTypeWithQualityHeaderValue
. Jeśli na przykład aplikacja żąda wysłania danych z powrotem w formacie JSON, może użyć następującego kodu:
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
W tym przykładzie wynik jest zwracany jako ciąg i zawiera tylko treść komunikatu odpowiedzi. Aby uzyskać całą odpowiedź, w tym nagłówki, treść i kod stanu, wywołaj metodę GetAsync
. Dane są zwracane jako HttpResponseMessage
obiekt.
Aktualizowanie zasobu za pomocą klienta HttpClient
Aby zaktualizować zasób przy użyciu polecenia HttpClient
, użyj inicjowanego HttpRequestMessage
czasownika PUT . Poniższy kod jest podobny do tego, który jest wymagany do utworzenia nowego zasobu:
HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, url);
message.Content = JsonContent.Create<Part>(part);
HttpResponseMessage response = await client.SendAsync(message);
Uwaga
Podstawowa różnica między elementami POST
i PUT
to idempotencyjność. Jeśli powtarzasz to samo PUT
żądanie kilka razy, ten sam zasób zostanie zaktualizowany o te same dane, a efekt jest taki sam, jak w przypadku wysłania żądania tylko raz. Jeśli wydasz to samo POST
żądanie kilka razy, wynikiem będzie usługa REST tworząca wiele kopii zasobu.
Usuwanie zasobu za pomocą obiektu HttpClient
Aby usunąć zasób przy użyciu polecenia HttpClient
, wywołaj SendAsync
metodę z zainicjowanym HttpRequestMessage
zleceniem DELETE :
HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Delete, url);
HttpResponseMessage response = await client.SendAsync(message);
Odpowiedź zawiera nagłówki, kod stanu i usunięty obiekt.
Obsługa odpowiedzi z żądania
Wszystkie żądania HTTP zwracają komunikat odpowiedzi. Dane w odpowiedzi zależą od tego, które zlecenie wysłała aplikacja. Na przykład treść odpowiedzi żądania HTTP GET
zawiera dane żądanego zasobu.
Treść POST
odpowiedzi żądania zwraca kopię utworzonego zasobu, ale treść PUT
odpowiedzi żądania powinna być pusta.
Zawsze należy sprawdzać i obsługiwać kod stanu w komunikacie odpowiedzi. Jeśli ten kod stanu znajduje się w zakresie 200 (200, 201, 202 itd.), operacja zostanie uznana za udaną, chociaż dalsze informacje mogą być wymagane później.
Kod stanu w zakresie 300 wskazuje, że żądanie mogło zostać przekierowane przez usługę internetową do innego adresu, prawdopodobnie w wyniku przeniesienia zasobu do innej lokalizacji.
Kod stanu w zakresie 400 wskazuje błąd klienta lub aplikacji. Na przykład kod stanu 403 oznacza, że usługa internetowa wymaga uwierzytelnienia użytkownika, ale aplikacja tego nie zrobiła. Kod stanu 404 występuje, gdy aplikacja próbuje uzyskać dostęp do zasobu, który nie istnieje.
Kody stanu w zakresie 500 wskazują na błąd po stronie serwera, taki jak usługa jest niedostępna lub zbyt zajęta do obsługi żądania.
HttpResponseMessage
Obiekt zwrócony przez żądanie przesłane za pośrednictwem HttpClient
obiektu może abstrakcją znaczną złożoność obsługi różnych kodów stanu. Ten fragment kodu pokazuje, jak sprawdzić, czy kod stanu w komunikacie odpowiedzi wskazuje powodzenie i obsługuje kody stanu wskazujące jakiś błąd.
static readonly HttpClient client = new HttpClient();
...
// Call asynchronous network methods in a try/catch block to handle exceptions.
try
{
//... Initiate the HttpRequest
HttpResponseMessage response = await client.SendAsync(msg);
response.EnsureSuccessStatusCode(); // Check that the status code is in the 200 range. Throw an HttpRequestException if not
string responseBody = await response.Content.ReadAsStringAsync();
... // Handle the response
}
catch(HttpRequestException e)
{
... // Handle any status codes that indicate an error.
// The status code is available in the field e.StatusCode
}