Cvičení – využití služby REST pomocí HttpClient

Dokončeno

V rámci aplikace, kterou technici používají na návštěvách webu zákazníka, musíte přidat funkci, která technikům umožňuje vyhledat podrobnosti o elektrických součástech. Tyto informace se budou uchovávat v databázi a budou k němu přistupovat prostřednictvím webové služby REST. Byli jste také požádáni o poskytnutí rozhraní, které správci umožňuje vytvářet, odebírat a upravovat podrobnosti částí uložených v databázi pomocí stejné webové služby REST.

V tomto cvičení nasadíte webovou službu REST do Azure a pak ověříte, že k ní máte přístup pomocí webového prohlížeče. Pak přidáte funkce do existující aplikace, která používá webovou službu REST k načtení, přidání, odstranění a aktualizaci podrobností o elektrických součástech.

Toto cvičení provedete pomocí sandboxu Azure.

Tip

Můžete použít tlačítko Kopírovat pro kopírování příkazů do schránky. Pokud chcete vložit, klikněte pravým tlačítkem myši na nový řádek v terminálu Cloud Shellu a vyberte Vložit nebo použijte klávesovou zkratku Shift+Insert (⌘+V v macOS).

Nasazení webové služby Parts REST

  1. V okně Cloud Shellu spusťte následující příkaz, který naklonuje úložiště obsahující kód pro toto cvičení, včetně webové služby Parts REST:

    git clone https://github.com/microsoftdocs/mslearn-dotnetmaui-consume-rest-services
    
  2. Přejděte do složky Consume-REST-services :

    cd mslearn-dotnetmaui-consume-rest-services/src
    
  3. Spuštěním následujícího příkazu nasaďte webovou službu Parts pomocí sandboxu Azure Cloud Shellu. Tento příkaz zpřístupní službu prostřednictvím jedinečné adresy URL. Poznamenejte si tuto adresu URL, když se zobrazí. Aplikaci nakonfigurujete tak, aby se pomocí této adresy URL připojila k webové službě.

    bash initenvironment.sh
    

Prozkoumání kódu webové služby

Poznámka:

Zbývající část tohoto cvičení provedete na místním vývojovém počítači.

  1. Na počítači otevřete okno příkazového řádku a naklonujte úložiště pro toto cvičení. Kód je v úložišti net-maui-learn-consume-rest-services .

    git clone https://github.com/microsoftdocs/mslearn-dotnetmaui-consume-rest-services
    

    Poznámka:

    Nejlepší je naklonovat nebo stáhnout obsah cvičení do krátké cesty ke složce, jako je C:\dev, aby se zabránilo překročení maximální délky cesty vygenerovaných sestavením.

  2. Ve svém klonu úložiště přejděte do složky src\webservice\PartsServer a otevřete řešení PartsServer.sln pomocí sady Visual Studio nebo složky v editoru Visual Studio Code. Toto řešení obsahuje kopii kódu webové služby, kterou jste nasadili do Azure v předchozím postupu.

  3. V okně Průzkumník řešení rozbalte složku Modely. Tato složka obsahuje dva soubory:

    • Part.cs. Třída Part představuje část poskytovanou webovou službou REST. Pole zahrnují ID části, název části, typ dílu, datum dostupnosti (kdy byla součást poprvé dodána) a seznam dodavatelů. Vlastnost Href vrátí relativní identifikátor URI části; klient REST může použít tento identifikátor URI k odkazování na tuto konkrétní část ve webové službě REST. Vlastnost Dodavatelé vrátí seznam dodavatelů části jako řetězec.

    • PartsFactory.cs. Třída PartsFactory inicializuje seznam částí poskytovaných službou pomocí malé sady pevně zakódovaných hodnot. V reálném světě by se tato data načetla z databáze.

  4. V okně Průzkumník řešení rozbalte složku Kontrolery. Tato složka obsahuje následující soubory:

    • PartsController.cs. Třída PartsController implementuje webové rozhraní API pro službu. Obsahuje metody, které klientské aplikaci umožňují načíst seznam všech částí (Get), najít podrobnosti o konkrétní části vzhledem k ID části (přetížená verze Get), aktualizovat podrobnosti části (Put), přidat novou část do seznamu (Post) a odebrat část ze seznamu (Delete).

    • LoginController.cs. LoginController třída implementuje jednoduchou formu ověřování pro webovou službu. Aplikace musí odeslat požadavek HTTP GET na tento kontroler, který vrátí autorizační token. Tento autorizační token slouží k ověření požadavků odeslaných do systému PartsController.

    • BaseController.cs. BaseController třída obsahuje logiku použitou k ověřování požadavků. PartsController třída dědí z této třídy. Pokud se klient pokusí volat metody ve třídě PartsController bez poskytnutí platného ověřovacího tokenu, metody vrátí odpověď HTTP 401 (neautorizováno).

Prozkoumání kódu klientské aplikace .NET MAUI

Tento modul používá sadu .NET 8.0 SDK. Spuštěním následujícího příkazu v upřednostňovaném příkazovém terminálu se ujistěte, že máte nainstalované rozhraní .NET 8.0:

dotnet --list-sdks

Zobrazí se výstup podobný následujícímu příkladu:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

Ujistěte se, že je uvedená verze, na 8 které začíná. Pokud žádný není uvedený nebo příkaz nebyl nalezen, nainstalujte nejnovější sadu .NET 8.0 SDK.

  1. Zavřete řešení PartsServer a otevřete řešení PartsClient ve složce src\client\PartsClient v naklonovaném úložišti. Toto řešení obsahuje částečnou implementaci klientské aplikace .NET MAUI, která používá webovou službu PartsServer .

  2. V okně Průzkumník řešení rozbalte složku Data. Tato složka obsahuje kód pro dvě třídy:

    • PartsManager.cs. Třída PartsManager poskytuje metody, které klientská aplikace používá k interakci s webovou službou REST. Tato třída je nyní neúplná; V tomto cvičení přidáte potřebný kód. Po dokončení se metoda GetClient připojí k webové službě REST. Metoda GetAll vrátí seznam částí z webové služby REST. Metoda Add přidá novou část do seznamu částí spravovaných webovou službou REST. Metoda Update upraví podrobnosti části uložené webovou službou REST a metoda Delete odebere část.

    • Part.cs. Třída Part modeluje část uloženou v databázi. Zpřístupňuje vlastnosti, které může aplikace použít pro přístup k polím PartID, PartName, PartAvailableDate, PartType a PartSuppliers . Třída také poskytuje metodu utility s názvem SupplierString , kterou může aplikace použít k načtení formátovaného řetězce obsahujícího názvy dodavatelů.

  3. V okně Průzkumník řešení rozbalte složku Stránky. Tato složka obsahuje kód a kód pro dvě stránky:

    • PartsPage.xaml. Tato stránka používá rozložení CollectionView s dataTemplate k zobrazení podrobností o částech dostupných jako seznam. DataTemplate používá datovou vazbu k připojení dat zobrazených k částem načteným z webové služby. Pokud chcete upravit část v AddPartPage, můžete vybrat řádek v objektu CollectionView nebo můžete vybrat tlačítko Přidat novou část a přidat novou část.

    • AddPartPage.xaml. Tato stránka umožňuje uživatelům zadat a uložit podrobnosti pro novou část. Uživatelé mohou zadat název části, typ části a počátečního dodavatele. ID části a datum dostupnosti části se vygenerují automaticky.

  4. V okně Průzkumník řešení rozbalte složku ViewModels. Tato složka obsahuje dvě třídy: AddPartViewModel.cs a PartsViewModel.cs. Jedná se o modely zobrazení pro příslušné stránky a obsahují vlastnosti a logiku, které stránka potřebuje k zobrazení a manipulaci s daty.

Přihlášení ke službě

Služba REST vyžaduje, abyste se nejdřív přihlásili, abyste získali autorizační token. Neexistuje žádné ověřování uživatele. Nejprve zavoláte konkrétní koncový bod, abyste získali autorizační token, a pak token odešlete zpět na server na každém následném požadavku v hlavičce HTTP.

  1. Otevřete soubor PartsManager.cs ve složce Data.

  2. Přidejte statická pole BaseAddress a Url definovaná v následujícím fragmentu kódu do třídy PartsManager . Nahraďte textovou adresu URL GOES HERE adresou URL webové služby REST, kterou jste si poznamenali dříve:

    public class PartsManager
    {
        static readonly string BaseAddress = "URL GOES HERE";
        static readonly string Url = $"{BaseAddress}/api/";
        ...
    }
    
  3. Za pole Adresa URL přidejte do třídy následující pole. Toto pole bude obsahovat autorizační token vrácený při přihlášení uživatele:

    private static string authorizationKey;
    
  4. Vyhledejte metodu GetClient . Tato metoda v současné době vyvolá výjimku NotImplementedException . Nahraďte existující kód v této metodě následujícím kódem. Tento kód vytvoří objekt HttpClient a odešle požadavek do koncového bodu přihlášení webové služby REST. Služba by měla odpovědět zprávou, která obsahuje autorizační token. Deserializovat tento token a přidat ho jako výchozí hlavičku žádosti o autorizaci pro následné požadavky odeslané pomocí objektu HttpClient :

    private static async Task<HttpClient> GetClient()
    {
        if (client != null)
            return client;
    
        client = new HttpClient();
    
        if (string.IsNullOrEmpty(authorizationKey))
        {                
            authorizationKey = await client.GetStringAsync($"{Url}login");
            authorizationKey = JsonSerializer.Deserialize<string>(authorizationKey);
        }
    
        client.DefaultRequestHeaders.Add("Authorization", authorizationKey);
        client.DefaultRequestHeaders.Add("Accept", "application/json");
    
        return client;
    }
    

Provedení operace GET pro načtení informací pro části

  1. V souboru PartsManager.cs vyhledejte metodu GetAll. Jedná se o asynchronní metodu, která vrací výčet částí. Tato metoda ještě není implementována.

  2. V této metodě odstraňte kód, který vyvolá Výjimku NotImplementedException .

  3. Pomocí třídy zkontrolujte, jestli má zařízení připojení k Connectivity internetu. Pokud internet není k dispozici, vraťte prázdnou List<Part>hodnotu .

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return new List<Part>();
    
  4. Voláním metody GetClient načtěte objekt HttpClient, se kterým chcete pracovat. Mějte na paměti, že GetClient je asynchronní, takže pomocí operátoru await zachyťte objekt vrácený touto metodou.

  5. Zavolejte Metodu GetStringAsync objektu HttpClient a zadejte základní adresu URL pro načtení pole částí z webové služby REST. Data se vrací asynchronně jako řetězec JSON.

  6. Deserializovat řetězec JSON vrácený touto metodou do seznamu part objektů pomocí JsonSerializer.Deserialize metoda. Vrátí tento seznam volajícímu.

    Dokončená metoda by měla vypadat takto:

    public static async Task<IEnumerable<Part>> GetAll()
    {
        if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
            return new List<Part>();
    
        var client = await GetClient();
        string result = await client.GetStringAsync($"{Url}parts");
    
        return JsonSerializer.Deserialize<List<Part>>(result, new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true,
            });                     
    }
    
  7. Sestavte a spusťte aplikaci. Při spuštění aplikace se zobrazí stránka Seznam částí a zobrazí se seznam částí načtených metodou GetAll . Následující obrázek ukazuje aplikaci spuštěnou na Androidu:

    A screenshot of the Parts Client app running on Android showing a list of parts.

  8. Po dokončení procházení dat zavřete aplikaci a vraťte se do sady Visual Studio nebo Visual Studio Code.

Provedení operace POST pro přidání nové části do databáze

  1. Ve třídě PartsManager vyhledejte metodu Add. Tato metoda obsahuje parametry pro název části, dodavatele a typ části. Metoda je asynchronní. Účelem metody je vložit novou část do databáze a vrátit objekt Part představující nově vytvořenou položku.

  2. Odstraňte existující kód v metodě.

  3. Pomocí třídy zkontrolujte, jestli má zařízení připojení k Connectivity internetu. Pokud internet není k dispozici, vraťte prázdnou Parthodnotu .

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return new Part();
    
  4. Vytvořte nový objekt části . Vyplňte pole předanými daty:

    • Nastavte pole PartID na prázdný řetězec. Toto ID bude generováno webovou službou REST.
    • Vytvořte nový seznam , který bude obsahovat název dodavatele.
    • Nastavte pole PartAvailableDate na DateTime.Now.
    • Získejte klienta HTTP z metody GetClient .
    var part = new Part()
    {
        PartName = partName,
        Suppliers = new List<string>(new[] { supplier }),
        PartID = string.Empty,
        PartType = partType,
        PartAvailableDate = DateTime.Now.Date
    };
    
  5. Voláním metody GetClient načtěte objekt HttpClient, se kterým chcete pracovat.

  6. Vytvořte HttpRequestMessage objekt. Tento objekt slouží k modelování požadavku odeslaného do webové služby. Zahajte ji s parametry označujícími, se kterým příkazem HTTP se má webová služba komunikovat, a adresou URL webové služby.

    var msg = new HttpRequestMessage(HttpMethod.Post, $"{Url}parts");
    
  7. Do webové služby je potřeba odeslat datovou část s informacemi o části , které chcete vytvořit. Tato datová část bude serializována do formátu JSON. Datová část JSON se přidá do HttpRequestMessage.Content vlastnosti a serializuje se metodou JsonContent.Create .

    msg.Content = JsonContent.Create<Part>(part);
    
  8. Teď odešlete zprávu do webové služby pomocí HttpClient.SendAsync funkce. Tato funkce vrátí HttpResponseMessage objekt, který obsahuje informace o operaci na serveru. Například kódy odpovědí HTTP a informace předané zpět ze serveru.

    var response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode();
    

    Všimněte si, že předchozí metoda používá response.EnsureSuccessStatusCode . Pokud se vrátí jiný stavový kód HTTP než 2xx, vyvolá se chyba.

  9. Pokud webová služba vrátí informace, jako je například objekt serializovaný ve formátu JSON, můžete ho přečíst z objektu HttpResponseMessage. Pak můžete deserializovat JSON pomocí JsonSerializer.Deserialize.

    var returnedJson = await response.Content.ReadAsStringAsync();
    
    var insertedPart = JsonSerializer.Deserialize<Part>(returnedJson, new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true,
            });
    
  10. Nakonec vraťte novou vloženou část.

    return insertedPart;
    
  11. Sestavte a spusťte aplikaci. Vyberte tlačítko Přidat novou část a zadejte název, typ a dodavatele a vytvořte novou část. Zvolte Uložit. Metoda Add ve třídě PartsManager se vyvolá, což vytvoří novou část ve webové službě. Pokud je operace úspěšná, stránka seznamu částí se znovu zobrazí s novou částí v dolní části seznamu.

    A screenshot of the app running after a new part has been added. The new part is at the bottom of the list.

  12. Po dokončení procházení dat zavřete aplikaci a vraťte se do sady Visual Studio nebo Visual Studio Code.

Provedení operace PUT pro aktualizaci podrobností pro část v databázi

  1. Ve třídě PartsManager vyhledejte metodu Update. Jedná se o asynchronní metodu , která jako parametr přebírá objekt Part . Metoda nemá explicitní návratovou hodnotu. Návratový typ je však Úkol , aby se výjimky správně vrátily zpět volajícímu. Pojďme implementovat funkci PUT .

  2. Odstraňte existující kód.

  3. Stejně jako předtím zkontrolujte připojení k internetu.

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return;
    
  4. Vytvořte novou HttpRequestMessage, tentokrát zadejte operaci PUT a adresu URL pro aktualizaci částí.

    HttpRequestMessage msg = new(HttpMethod.Put, $"{Url}parts/{part.PartID}");
    
  5. Content Nastavte vlastnost HttpRequestMessage using JsonContent.Create funkce a parametr části, který byl předán do funkce.

    msg.Content = JsonContent.Create<Part>(part);
    
  6. Získejte klienta HTTP z metody GetClient .

    var client = await GetClient();
    
  7. Odešlete žádost s HttpClient žádostí a ujistěte se, že byla úspěšná.

    var response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode();
    
  8. Sestavte a spusťte aplikaci. Ze seznamu vyberte jednu z částí. Zobrazí se stránka Přidat část , tentokrát s vlastnostmi, které jsou již vyplněny. Aktualizujte, co chcete.

  9. Zvolte Uložit. Tím se volá metoda Update ve třídě PartsManager k odeslání změn do webové služby. Pokud bude stránka seznamu částí úspěšná, změny se projeví znovu.

    A screenshot of the app running with the first item in the list updated.

    Poznámka:

    Část, kterou jste přidali do předchozího úkolu, se nezobrazí na stránce Seznam částí. Data, která aplikace používá, se při každém spuštění aplikace resetují na seznam předdefinovaných částí. Tím zajistíte konzistenci pro testování aplikace.

Provedení operace DELETE pro odebrání podrobností části z databáze

  1. Ve třídě PartsManager vyhledejte metodu Delete. Jedná se o asynchronní metodu , která přebírá řetězec partId a vrací Task.

  2. Odstraňte existující kód.

  3. Zkontrolujte připojení k internetu.

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return;
    
  4. Vytvořte nový HttpRequestMessage objekt. Pouze teď zadejte příkaz DELETE HTTP a adresu URL pro odstranění části.

    HttpRequestMessage msg = new(HttpMethod.Delete, $"{Url}parts/{partID}");
    
  5. Získejte klienta HTTP z metody GetClient .

    var client = await GetClient();
    
  6. Odešlete požadavek webové službě. Po návratu zkontrolujte úspěch.

    var response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode();
    
  7. Sestavte a spusťte aplikaci. Vyberte část ze seznamu a pak na stránce Přidat část vyberte Odstranit. V případě úspěchu se znovu zobrazí stránka Seznam částí a část, kterou jste odstranili, se už nezobrazí.