Gyakorlat – REST-szolgáltatás használata a HttpClient használatával

Befejeződött

Az alkalmazás részeként, amelyet a mérnökök az ügyfélwebhelyek látogatásai során használnak, hozzá kell adnia egy funkciót, amely lehetővé teszi a mérnökök számára az elektromos alkatrészek részleteinek keresését. Ezek az információk egy adatbázisban lesznek tárolva, és egy REST webszolgáltatáson keresztül lesznek elérhetők. Arra is felkérték, hogy adjon meg egy felületet, amellyel a rendszergazda létrehozhatja, eltávolíthatja és módosíthatja az adatbázisban tárolt alkatrészek adatait ugyanazzal a REST webszolgáltatással.

Ebben a gyakorlatban üzembe helyezi a REST webszolgáltatást az Azure-ban, majd ellenőrzi, hogy elérhető-e egy webböngészővel. Ezután olyan funkciókat fog hozzáadni egy meglévő alkalmazáshoz, amely a REST webszolgáltatást használja az elektromos összetevők adatainak lekéréséhez, hozzáadásához, törléséhez és frissítéséhez.

Ezt a gyakorlatot az Azure-tesztkörnyezet használatával fogja elvégezni.

Tipp.

A Másolás gombbal a vágólapra másolhatja a parancsokat. Beillesztéshez kattintson a jobb gombbal egy új sorra a Cloud Shell-terminálban, és válassza a Beillesztés lehetőséget, vagy használja a Shift+Beszúrás billentyűparancsot (⌘+V macOS rendszeren).

A Parts REST webszolgáltatás üzembe helyezése

  1. A Cloud Shell ablakában futtassa a következő parancsot a gyakorlat kódját tartalmazó adattár klónozásához, beleértve a Parts REST webszolgáltatást is:

    git clone https://github.com/microsoftdocs/mslearn-dotnetmaui-consume-rest-services
    
  2. Ugrás a Consume-REST-services mappára:

    cd mslearn-dotnetmaui-consume-rest-services/src
    
  3. Futtassa az alábbi parancsot a Parts webszolgáltatás üzembe helyezéséhez az Azure Cloud Shell tesztkörnyezetével. Ez a parancs egy egyedi URL-címen teszi elérhetővé a szolgáltatást. Jegyezze fel ezt az URL-címet, amikor megjelenik. Ezzel az URL-címvel konfigurálja az alkalmazást a webszolgáltatáshoz való csatlakozásra.

    bash initenvironment.sh
    

A webszolgáltatás kódjának vizsgálata

Megjegyzés:

A gyakorlat hátralévő részét a helyi fejlesztőszámítógépen fogja elvégezni.

  1. A számítógépen nyisson meg egy parancssori ablakot, és klónozza a gyakorlathoz tartozó adattárat. A kód a net-maui-learn-consume-rest-services adattárban található.

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

    Megjegyzés:

    A legjobb, ha klónozza vagy letölti a gyakorlat tartalmát egy rövid mappa elérési útjára( például C:\dev), hogy elkerülje a build által létrehozott fájlok maximális elérési útját.

  2. Nyissa meg az adattár klónjában található src\webservice\PartsServer mappát, és nyissa meg a PartsServer.sln megoldást a Visual Studióval vagy a Visual Studio Code mappájával. Ez a megoldás az Azure-ban az előző eljárásban üzembe helyezett webszolgáltatás kódjának másolatát tartalmazza.

  3. A Megoldáskezelő ablakban bontsa ki a Modellek mappát. Ez a mappa két fájlt tartalmaz:

    • Part.cs. A részosztály a REST webszolgáltatás által biztosított részt jelöli. A mezők tartalmazzák a cikk azonosítóját, a cikk nevét, a cikk típusát, a rendelkezésre állás dátumát (a cikk első megadásakor) és a szállítók listáját. A Href tulajdonság a rész relatív URI-ját adja vissza; a REST-ügyfél ezt az URI-t használhatja a REST webszolgáltatásban erre az adott részre való hivatkozáshoz. A Szállítók tulajdonság sztringként adja vissza a rész szállítóinak listáját.

    • PartsFactory.cs. A PartsFactory osztály inicializálja a szolgáltatás által biztosított alkatrészek listáját egy kis, nehezen kódolt értékhalmaz használatával. A valós világban ezek az adatok egy adatbázisból lesznek lekérve.

  4. A Megoldáskezelő ablakban bontsa ki a Vezérlők mappát. Ez a mappa a következő fájlokat tartalmazza:

    • PartsController.cs. A PartsController osztály implementálja a szolgáltatáshoz tartozó webes API-t. Olyan módszereket tartalmaz, amelyekkel az ügyfélalkalmazás lekérheti az összes rész listáját (Get), megkeresheti egy adott rész részleteit a részazonosító (a Get túlterhelt verziója) alapján, frissítheti egy rész részleteit (Put), új részt vehet fel a listára (Post), és eltávolíthat egy részt a listából (Törlés).

    • LoginController.cs. A LoginController osztály egy egyszerű hitelesítési formát implementál a webszolgáltatáshoz. Az alkalmazásnak HTTP GET kérést kell küldenie ehhez a vezérlőhöz, amely egy engedélyezési jogkivonatot ad vissza. Ez az engedélyezési jogkivonat a PartsControllernek küldött kérések hitelesítésére szolgál.

    • BaseController.cs. A BaseController osztály a kérelmek hitelesítéséhez használt logikát tartalmazza. A PartsController osztály ebből az osztályból öröklődik. Ha az ügyfél egy érvényes hitelesítési jogkivonat megadása nélkül próbál metódusokat meghívni a PartsController osztályban, a metódusok HTTP 401 (jogosulatlan) választ adnak vissza.

A .NET MAUI-ügyfélalkalmazás kódjának vizsgálata

Ez a modul a .NET 8.0 SDK-t használja. Győződjön meg arról, hogy telepítve van a .NET 8.0, ha az alábbi parancsot futtatja az előnyben részesített parancsterminálban:

dotnet --list-sdks

A következő példához hasonló kimenet jelenik meg:

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

Győződjön meg arról, hogy az első 8 verzió szerepel a listában. Ha egyik sem szerepel a listában, vagy a parancs nem található, telepítse a legújabb .NET 8.0 SDK-t.

  1. Zárja be a PartsServer-megoldást , és nyissa meg a PartsClient-megoldást a klónozott adattár src\client\PartsClient mappájában. Ez a megoldás a PartsServer webszolgáltatást használó .NET MAUI-ügyfélalkalmazás részleges implementációját tartalmazza.

  2. Az Megoldáskezelő ablakban bontsa ki az Adatok mappát. Ez a mappa két osztály kódját tartalmazza:

    • PartsManager.cs. A PartsManager osztály azokat a metódusokat tartalmazza, amelyeket az ügyfélalkalmazás a REST webszolgáltatással való interakcióhoz használ. Ez az osztály jelenleg hiányos; a gyakorlat során hozzá fogja adni a szükséges kódot. Ha elkészült, a GetClient metódus csatlakozik a REST webszolgáltatáshoz. A GetAll metódus a REST webszolgáltatás részeinek listáját adja vissza. Az Add metódus új részt ad hozzá a REST webszolgáltatás által felügyelt részek listájához. Az Update metódus módosítja a REST webszolgáltatás által tárolt rész részleteit, a Törlés metódus pedig eltávolít egy részt.

    • Part.cs. A részosztály az adatbázisban tárolt részt modellozza. Olyan tulajdonságokat tesz elérhetővé, amelyekkel egy alkalmazás hozzáférhet a PartID, a PartName, a PartAvailableDate, a PartType és a PartSuppliers mezőkhöz. Az osztály egy SupplierString nevű segédprogramot is biztosít, amellyel egy alkalmazás lekérheti a szállítóneveket tartalmazó formázott sztringet.

  3. Az Megoldáskezelő ablakban bontsa ki a Pages mappát. Ez a mappa két oldal korrektúrát és kódot tartalmaz:

    • PartsPage.xaml. Ez a lap egy CollectionView-elrendezést és egy DataTemplate-et használ a listaként elérhető részek részleteinek megjelenítéséhez. A DataTemplate adatkötés használatával csatlakoztatja a megjelenített adatokat a webszolgáltatásból lekért részekhez. Kiválaszthat egy sort a CollectionView-ban az AddPartPage egy részének szerkesztéséhez, vagy az Új rész hozzáadása gombra kattintva új alkatrészt vehet fel.

    • AddPartPage.xaml. Ez a lap lehetővé teszi, hogy a felhasználók beírják és mentsék az új rész részleteit. A felhasználók megadhatják a cikk nevét, az alkatrész típusát és a kezdeti szállítót. A cikkazonosító és a rendelkezésre álló rész dátuma automatikusan létrejön.

  4. A Megoldáskezelő ablakban bontsa ki a ViewModels mappát. Ez a mappa két osztályt tartalmaz: AddPartViewModel.cs és PartsViewModel.cs. Ezek a lapjaik nézetmodelljei, és olyan tulajdonságokat és logikát tartalmaznak, amelyeket a lapnak meg kell jelenítenie és módosítania kell az adatokat.

Bejelentkezés a szolgáltatásba

A REST szolgáltatáshoz először be kell jelentkeznie egy engedélyezési jogkivonat lekéréséhez. Nincs felhasználói hitelesítés. Először egy adott végpontot hív meg egy engedélyezési jogkivonat lekéréséhez, majd visszaküldi a jogkivonatot a kiszolgálónak a HTTP-fejléc minden további kérésekor.

  1. Nyissa meg a PartsManager.cs fájlt az Adatok mappában.

  2. Adja hozzá a BaseAddress ésurl statikus mezőket az alábbi kódrészletben meghatározottak szerint a PartsManager osztályhoz. Cserélje le a "GOES HERE" szöveges URL-címet a korábban feljegyzett REST webszolgáltatás URL-címére:

    public class PartsManager
    {
        static readonly string BaseAddress = "URL GOES HERE";
        static readonly string Url = $"{BaseAddress}/api/";
        ...
    }
    
  3. Adja hozzá a következő mezőt az osztályhoz az URL-mező után. Ez a mező a felhasználó bejelentkezésekor visszaadott engedélyezési jogkivonatot fogja tárolni:

    private static string authorizationKey;
    
  4. Keresse meg a GetClient metódust. Ez a metódus jelenleg NotImplementedException kivételt eredményez. Cserélje le a metódus meglévő kódját a következő kódra. Ez a kód létrehoz egy HttpClient-objektumot , majd kérést küld a REST webszolgáltatás bejelentkezési végpontjának. A szolgáltatásnak az engedélyezési jogkivonatot tartalmazó üzenettel kell válaszolnia. Deszerializálja ezt a jogkivonatot, és adja hozzá alapértelmezett engedélyezési kérelemfejlécként a HttpClient objektummal küldött további kérésekhez:

    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;
    }
    

GET művelet végrehajtása az alkatrészek adatainak lekéréséhez

  1. A PartsManager.cs fájlban keresse meg a GetAll metódust. Ez egy aszinkron módszer, amely számbavehető alkatrészlistát ad vissza. Ez a módszer még nincs implementálva.

  2. Ebben a metódusban törölje a NotImplementedException kivételt okozó kódot.

  3. Ellenőrizze, hogy az eszköz rendelkezik-e internetkapcsolattal az Connectivity osztály használatával. Ha az internet nincs jelen, üres értéket List<Part>ad vissza.

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return new List<Part>();
    
  4. Hívja meg a GetClient metódust egy HttpClient-objektum lekéréséhez, hogy működjön együtt. Ne feledje, hogy a GetClient aszinkron, ezért a várakozás operátorral rögzítse az ezzel a módszerrel visszaadott objektumot.

  5. Hívja meg a HttpClient objektum GetStringAsync metódusát, és adja meg az alap URL-címet, amely egy résztömböt kér le a REST webszolgáltatásból. Az adatok aszinkron módon JSON-sztringként lesznek visszaadva.

  6. A JsonSerializer.Deserialize metódussal deszerializálja a metódus által visszaadott JSON-sztringet a részobjektumok listájába. Adja vissza ezt a listát a hívónak.

    A kész metódusnak így kell kinéznie:

    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. Hozza létre és futtassa az alkalmazást. Az alkalmazás indításakor megjelenik a Kijelzőlista lap, és meg kell jelennie a GetAll metódus által lekért részek listájának. Az alábbi képen az Androidon futó alkalmazás látható:

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

  8. Ha befejezte az adatok böngészését, zárja be az alkalmazást, és térjen vissza a Visual Studióba vagy a Visual Studio Code-ba.

POST művelet végrehajtása új rész adatbázishoz való hozzáadásához

  1. A PartsManager osztályban keresse meg az Add metódust. Ez a metódus paraméterekkel rendelkezik a cikknévhez, a szállítóhoz és az alkatrésztípushoz. A metódus aszinkron. A metódus célja egy új rész beszúrása az adatbázisba, és egy , az újonnan létrehozott elemet képviselő részobjektum visszaadása.

  2. Törölje a metódus meglévő kódját.

  3. Ellenőrizze, hogy az eszköz rendelkezik-e internetkapcsolattal az Connectivity osztály használatával. Ha az internet nincs jelen, üres értéket Partad vissza.

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return new Part();
    
  4. Hozzon létre egy új részobjektumot . Töltse ki a mezőket az átadott adatokkal:

    • Állítsa a PartID mezőt üres sztringre. Ezt az azonosítót a REST webszolgáltatás hozza létre.
    • Hozzon létre egy új listát a szállító nevének tárolásához.
    • Állítsa a PartAvailableDate mezőt DateTime.Now értékre.
    • HTTP-ügyfél lekérése a GetClient metódusból.
    var part = new Part()
    {
        PartName = partName,
        Suppliers = new List<string>(new[] { supplier }),
        PartID = string.Empty,
        PartType = partType,
        PartAvailableDate = DateTime.Now.Date
    };
    
  5. Hívja meg a GetClient metódust egy HttpClient-objektum lekéréséhez, hogy működjön együtt.

  6. Hozzon létre egy objektumot HttpRequestMessage . Ez az objektum a webszolgáltatásnak küldött kérés modellezésére szolgál. Kezdeményezheti olyan paraméterekkel, amelyek jelzik, hogy melyik HTTP-parancsot és a webszolgáltatás URL-címét kell használni a kommunikációhoz.

    var msg = new HttpRequestMessage(HttpMethod.Post, $"{Url}parts");
    
  7. A létrehozandó részinformációkkal hasznos adatokat kell küldenie a webszolgáltatásnak. Ez a hasznos adat JSON-ra lesz szerializálva. A JSON hasznos adatai hozzá lesznek adva a HttpRequestMessage.Content tulajdonsághoz, és szerializálva lesz a JsonContent.Create metódussal.

    msg.Content = JsonContent.Create<Part>(part);
    
  8. Most küldje el az üzenetet a webszolgáltatásnak a HttpClient.SendAsync függvény használatával. Ez a függvény egy objektumot HttpResponseMessage ad vissza, amely a kiszolgálón található művelettel kapcsolatos információkat tartalmazza. Ilyenek például a HTTP-válaszkódok és a kiszolgálótól kapott információk.

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

    Vegye figyelembe, hogy az előző a metódust response.EnsureSuccessStatusCode használja. Ez hibát jelez, ha a rendszer nem 2xx HTTP-állapotkódot ad vissza.

  9. Ha a webszolgáltatás olyan információkat ad vissza, mint például egy JSON-ban szerializált objektum, akkor kiolvashatja a HttpResponseMessagerendszerből. Ezután deszerializálhatja a JSON-t a használatával JsonSerializer.Deserialize.

    var returnedJson = await response.Content.ReadAsStringAsync();
    
    var insertedPart = JsonSerializer.Deserialize<Part>(returnedJson, new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true,
            });
    
  10. Végül adja vissza az új beszúrt részt.

    return insertedPart;
    
  11. Hozza létre és futtassa az alkalmazást. Kattintson az Új alkatrész hozzáadása gombra, és adjon meg egy nevet, típust és szállítót egy új alkatrész létrehozásához. Válassza a Mentés parancsot. A Rendszer meghívja a PartsManager osztály Add metódusát, amely létrehozza az új részt a webszolgáltatásban. Ha a művelet sikeres, a kijelzőlista lapja újra megjelenik a lista alján található új kijelzővel.

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

  12. Ha befejezte az adatok böngészését, zárja be az alkalmazást, és térjen vissza a Visual Studióba vagy a Visual Studio Code-ba.

PUT művelet végrehajtása az adatbázis egy részének adatainak frissítéséhez

  1. A PartsManager osztályban keresse meg az Update metódust. Ez egy aszinkron módszer, amely egy részobjektumot vesz fel paraméterként. A metódus nem rendelkezik explicit visszatérési értékkel. A visszatérési típus azonban Feladat, így a kivételek megfelelően visszakerülnek a hívónak. Implementáljuk a PUT funkciót.

  2. Törölje a meglévő kódot.

  3. Mint korábban, ellenőrizze, hogy van-e internetkapcsolat.

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return;
    
  4. Hozzon létre egy új HttpRequestMessage, ezúttal PUT műveletet és az alkatrészek frissítéséhez szükséges URL-címet.

    HttpRequestMessage msg = new(HttpMethod.Put, $"{Url}parts/{part.PartID}");
    
  5. Állítsa be a ContentHttpRequestMessage függvényt használó JsonContent.Create függvény és a függvénybe átadott részparaméter tulajdonságát.

    msg.Content = JsonContent.Create<Part>(part);
    
  6. HTTP-ügyfél lekérése a GetClient metódusból.

    var client = await GetClient();
    
  7. Küldje el a kérést a következővel, HttpClient majd győződjön meg arról, hogy sikeres volt.

    var response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode();
    
  8. Hozza létre és futtassa az alkalmazást. Válasszon ki egyet a listából. Megjelenik az AddPart lap, ezúttal a már kitöltött tulajdonságokkal. Frissítsen bármit, amit szeretne.

  9. Válassza a Mentés parancsot. Ez meghívja a PartsManager osztály Frissítés metódusát, hogy elküldje a módosításokat a webszolgáltatásnak. Ha sikeres, a részek listája oldal újra megjelenik a változások tükröződnek.

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

    Megjegyzés:

    Az előző feladatban hozzáadott rész nem jelenik meg a Kijelzőlista lapon. Az alkalmazás által használt adatok az alkalmazás minden futtatásakor visszaállíthatók az előre definiált részek listájára. Ez konzisztenciát biztosít az alkalmazás teszteléséhez.

DELETE művelet végrehajtása egy rész adatainak az adatbázisból való eltávolításához

  1. A PartsManager osztályban keresse meg a Delete metódust. Ez egy aszinkron metódus, amely egy partId sztringet használ, és egy feladatot ad vissza.

  2. Törölje a meglévő kódot.

  3. Ellenőrizze, hogy van-e internetkapcsolat.

    if (Connectivity.Current.NetworkAccess != NetworkAccess.Internet)
        return;
    
  4. Hozzon létre egy új HttpRequestMessage objektumot. Csak most adja meg a DELETE HTTP parancsot és a rész törléséhez használandó URL-címet.

    HttpRequestMessage msg = new(HttpMethod.Delete, $"{Url}parts/{partID}");
    
  5. HTTP-ügyfél lekérése a GetClient metódusból.

    var client = await GetClient();
    
  6. Küldje el a kérést a webszolgáltatásnak. A visszatérés után ellenőrizze a sikert.

    var response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode();
    
  7. Hozza létre és futtassa az alkalmazást. Jelöljön ki egy részt a listából, majd válassza a Törlés lehetőséget a Kijelző hozzáadása lapon. Ha sikeres, a Kijelzőlista lap újra megjelenik, és a törölt rész többé nem lesz látható.