C# REST API kezelés

C# programozás

A REST (Representational State Transfer) API-k segítségével a WPF, Windows Form alkalmazásunk kommunikálhat külső szolgáltatásokkal, adatokat kérhet le (GET), küldhet (POST), módosíthat (PUT), törölhet (DELETE). Ezek a CRUD műveletek, amiket már JS-ben is megnéztünk.

C#-ban a HttpClient osztályt fogjuk használni a HTTP kérések küldésére és fogadására. Ehhez a System.Net.Http névteret kell importálni.

A HttpClient aszinkron metódusokat biztosít a HTTP kérésekhez.

createPostAsync(uri, content)Új erőforrás létrehozása, vagy adat küldése
readGetAsync(uri)Adatok lekérése
updatePutAsync(uri, content)Frissítés
deleteDeleteAsync(uri)Törlés

Ezek a metódusok egy HttpResponseMessage-et adnak vissza, ami tartalmazza a válasz státuszkódját, fejlécét, törzsét.

Tehát, ha megkaptuk a  HttpResponseMessage-et, ellenőrizni célszerű a státusz kódot.

  • response.IsSuccessStatusCode: igaz, ha a státuszkód 200-299 közötti érték
  • response.StatusCode: a konkrét státuszkód (pl: HttpStatusCode.OK, HttpStatusCode.NotFound, HttpStatusCode.InternalServerError)

A válasz törzse:

  • response.Content.ReadAsStringAsync() string-ként
  • response.Content.ReadAsByteArrayAsync(): Bájt-tömbként olvassa be.
  • response.Content.ReadAsStreamAsync(): Streamként olvassa be.

Adat szerializáció és deszerializáció (JSON/XML)
A REST API-k gyakran JSON vagy XML formátumban küldenek/fogadnak adatokat.

Deszerializáció (válasz törzséből C# objektummá): A válasz string vagy stream tartalmát C# objektumokká kell alakítani.

  • System.Text.Json: A .NET Core 3.1+ beépített, nagy teljesítményű JSON szerializálója/deszerializálója. JsonSerializer.Deserialize(jsonString) vagy JsonSerializer.DeserializeAsync(stream).
  • Newtonsoft.Json (Json.NET): Nagyon népszerű, rugalmas, harmadik féltől származó könyvtár. JsonConvert.DeserializeObject(jsonString).

Szerializáció (C# objektumból kérés törzsévé): Amikor adatot küldünk (POST, PUT), a C# objektumokat JSON/XML stringgé kell alakítani.

  • System.Text.Json: JsonSerializer.Serialize(object).
  • Newtonsoft.Json: JsonConvert.SerializeObject(object).

Ehhez szükségünk lesz C# osztályokra, amelyek struktúrája megegyezik az API által használt adatstruktúrával.

Az aszinkron működés fontossága.(async és await): Azért fontos a használatuk, mert a hálózati kérések lassúak lehetnek (ezredmásodpercek vagy akár másodpercek). Ha ezeket szinkron módon hívnánk meg az UI szálon, az alkalmazás lefagyna, nem reagálna, amíg a kérés be nem fejeződik.
Az HttpClient metódusai már aszinkronok! (GetAsync, PostAsync stb.).

1.példa: GetAsync, adatok lekérése

Nézzünk egy példát! A dog.ceo api végpontjáról töltsünk be egy kutyás képet gombnyomásta! Ehhez szükség lesz egy gombra, egy image vezérlőre.
var: automatikusan felveszi azt a típust, amit a jobb oldalon kap

var response = await _httpClient.GetAsync(apiUrl);
HttpResponseMessage response = await _httpClient.GetAsync(apiUrl);

var content = await response.Content.ReadAsStringAsync();
string content = await response.Content.ReadAsStringAsync();

var dogData = JsonSerializer.Deserialize(content);
DogApiResponse dogData = JsonSerializer.Deserialize(content);

2. példa: Rick and Morty – szereplők adatainak lekérése, szintén GetAsync

Ebben a példában a RickAndMorty api-ról fogjuk egy karakter adatait lekérni. Ez a végpont jóval több adatot ad vissza, mint a kutyás példa.

Az ablak felépítése egyszerű, van egy gomb, egy kép, és szöveg blokkok, amelyek megjelenítik az adatokat.

MainWindows.xaml

MainWindow.xaml.cs

Az osztály kicsit összetettebb., mint a kutyás példában. Az „origin” és a „location” egy-egy objektum az objektumon belül. Ezeket külön osztályba célszerű tenni. Az „episode” egy tömb, aminek az elemeit hozzáadtam a stringhez a sting.Join() segítségével.
Ennél elegánsabb, ha nem az egész url-t iratjuk ki, hanem csak az epizódok számát. Kommentelt részben látható, az utolsó /-jel utáni számot adom hozzá ebben az esetben a szöveghez.

3. példa 10db macskás kép megjelenítése API végpont segítségével

A programunk felülete tartalmazzon egy ScrollViewer-t. Ezen belül hozzunk létre egy gombot, és egy StackPanelt! Ehhez a StackPanel-hez fogjuk hozzáadni a képeket!

MainWindwow.xaml

A gombunk feladata: képek újratöltése. Ehhez törölni kell az előző adag képet, és betölteni 10db új képet. A gomb működéséért a ReloadImages_Click() eljárás felel.

Az API egy tömböt, azon belül 10db objektumot ad vissza. Minden objektumnak van 4db adata: id, url, width, height.Ezekből készítünk egy osztályt, mint az eddigi feladatoknál.

LoadCatImages(): mivel 10db adatot kapunk, azokon végig fogunk menni, és hozzáadjuk őket a StackPanelhez (aminek a neve ImagePanel) Nagyon hasonló a metódus, mint JS esetén, gyermek elemeket adunk a szülő elemnek. A képeket BitmapImage()-ként tároljuk.

MainWindows.xaml.cs