Gyakorlat – Vezérlő hozzáadása

Befejeződött

A vezérlő egy nyilvános osztály, amely egy vagy több, úgynevezett műveletként ismert nyilvános metódussal rendelkezik. Konvenció szerint a rendszer egy vezérlőt helyez el a projekt gyökérkönyvtárában. A műveletek HTTP-végpontként jelennek meg a webes API-vezérlőben.

Vezérlő létrehozása

  1. Válassza ki a Controllers mappát a Visual Studio Code-ban, és adjon hozzá egy új, PizzaController.cs nevű fájlt.

    Képernyőkép a Visual Studio Code-ról, amelyen egy új fájl hozzáadása látható a Controllers mappához.

    A vezérlők könyvtárában létrejön egy PizzaController.cs nevű üres osztályfájl. A Vezérlők könyvtárnév egy konvenció. A címtár neve a webes API által használt modellnézet-vezérlő architektúrából származik.

    Feljegyzés

    Konvenció szerint a vezérlőosztályok neve a Controller utótaggal van elnevezve.

  2. Adja hozzá a következő kódot a vezérlőkhöz/PizzaController.cs. Mentse a módosításokat.

    using ContosoPizza.Models;
    using ContosoPizza.Services;
    using Microsoft.AspNetCore.Mvc;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class PizzaController : ControllerBase
    {
        public PizzaController()
        {
        }
    
        // GET all action
    
        // GET by Id action
    
        // POST action
    
        // PUT action
    
        // DELETE action
    }
    

    Ahogy azt korábban megtudta, ez az osztály a HTTP-kérések ASP.NET Core-ban való használatának alaposztályából ControllerBaseszármazik. Emellett tartalmazza a két standard attribútumot is, amelyről tanult: [ApiController] és [Route]. Az attribútum a [Route] korábbiakhoz hasonlóan meghatározza a jogkivonathoz való leképezést [controller] . Mivel ez a vezérlőosztály neve el van nevezvePizzaController, ez a vezérlő kezeli a kéréseket.https://localhost:{PORT}/pizza

Az összes pizza lekérése

Az első REST-ige, amelyet implementálnia kell, az GETaz, hogy az ügyfél minden pizzát le tud szerezni az API-ból. A beépített [HttpGet] attribútummal meghatározhat egy metódust, amely visszaadja a pizzákat a szolgáltatásból.

Cserélje le a // GET all actionvezérlők/PizzaController.cs megjegyzését a következő kódra:

[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

A fenti művelet a következőket végzi el:

  • Csak a HTTP-igére GET válaszol az attribútum által [HttpGet] meghatározott módon.
  • Egy típuspéldányt ActionResultList<Pizza>ad vissza. A ActionResult típus a ASP.NET Core összes műveleteredményének alaposztálya.
  • Lekérdezi a szolgáltatást az összes pizza esetében, és automatikusan visszaadja a következő értékkel Content-Typerendelkező application/json adatokat: .

Egyetlen pizza lekérése

Előfordulhat, hogy az ügyfél a teljes lista helyett egy adott pizzáról szeretne információt kérni. Egy paramétert GET igénylő másik id műveletet is implementálhat. A beépített [HttpGet("{id}")] attribútummal meghatározhat egy metódust, amely visszaadja a pizzákat a szolgáltatásból. Az útválasztási [HttpGet] logika két különböző útvonalként regisztrálja a (nem id) és [HttpGet("{id}")] a (with id) útvonalat. Ezután külön műveletet írhat egyetlen elem lekéréséhez.

Cserélje le a // GET by Id actionvezérlők/PizzaController.cs megjegyzését a következő kódra:

[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

A fenti művelet a következőket végzi el:

  • Csak a HTTP-igére GET válaszol az attribútum által [HttpGet] meghatározott módon.
  • Megköveteli, hogy a id paraméter értéke szerepel a következő pizza/URL-szegmensben. Ne feledje, hogy a vezérlőszintű [Route] attribútum definiálta a /pizza mintát.
  • Lekérdezi az adatbázist a megadott id paraméternek megfelelő pizzához.

Az előző műveletben használt példányok ActionResult megfeleltetve lesznek a megfelelő HTTP-állapotkódhoz a következő táblázatban:

ASP.NET Core
a művelet eredménye
HTTP-állapotkód Leírás
Ok beleértve 200 A megadott id paraméternek megfelelő termék a memóriabeli gyorsítótárban található.
A termék a http-kérelem fejlécében (alapértelmezés szerint JSON) meghatározott accept médiatípus válasz törzsében található.
NotFound 404 A megadott id paraméternek megfelelő termék nem létezik a memóriabeli gyorsítótárban.

Az új vezérlő létrehozása és futtatása

Hozza létre és indítsa el a webes API-t az alábbi parancs futtatásával:

dotnet run

A vezérlő tesztelése Http-fájllal

  1. A ContosoPizza.http megnyitása

  2. Adjon hozzá egy új GET-t a Pizza végpont meghívásához a ### elválasztó alatt:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. Válassza a Kérés küldése parancsot az új GET-hívás felett.

    Az előző parancs a JSON-ban lévő összes pizza listáját adja vissza:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 16:57:09 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]   
    
  4. Ha egyetlen pizzát szeretne lekérdezni, egy másik GET kérést is megadhat, de a következő paranccsal adhat meg egy id paramétert:

    GET {{ContosoPizza_HostAddress}}/pizza/1
    Accept: application/json
    
    ###
    

    Az előző parancs a következő kimenettel tér vissza Classic Italian :

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  5. Az API olyan helyzeteket is kezel, amikor az elem nem létezik. Hívja meg újra az API-t, de adjon meg egy érvénytelen pizzaparamétert id a következő paranccsal:

    GET {{ContosoPizza_HostAddress}}/pizza/5
    Accept: application/json
    
    ###
    

    Az előző parancs egy 404 Not Found hibát ad vissza a következő kimenettel:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    

Most, hogy befejezte az igék implementálását GET . A következő leckében további műveleteket adhat hozzá a CRUD-műveletek támogatásához PizzaController a pizzaadatokon.

Nem kötelező: A vezérlő tesztelése parancssori HTTP Read-Eval-Print Loop (REPL) használatával

  1. Nyissa meg a meglévő httprepl terminált, vagy nyisson meg egy új integrált terminált a Visual Studio Code-ból a főmenü Új terminál termináljának> kiválasztásával.

  2. Csatlakozzon a webes API-hoz a következő parancs futtatásával:

    httprepl https://localhost:{PORT}
    

    Másik lehetőségként futtassa a következő parancsot bármikor, miközben HttpRepl fut:

    connect https://localhost:{PORT}
    
  3. Az újonnan elérhető Pizza végpont megtekintéséhez futtassa a következő parancsot:

    ls
    

    Az előző parancs észleli a csatlakoztatott végponton elérhető összes API-t. A következő kódot kell megjelenítenie:

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. Lépjen a Pizza végpontra a következő parancs futtatásával:

    cd Pizza
    

    Az előző parancs a végponthoz elérhető API-k kimenetét jeleníti meg Pizza :

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. Küldjön GET be egy kérést HttpRepl a következő paranccsal:

    get
    

    Az előző parancs a JSON-ban lévő összes pizza listáját adja vissza:

      HTTP/1.1 200 OK
      Content-Type: application/json; charset=utf-8
      Date: Fri, 02 Apr 2021 21:55:53 GMT
      Server: Kestrel
      Transfer-Encoding: chunked
    
      [
          {
              "id": 1,
              "name": "Classic Italian",
              "isGlutenFree": false
          },
          {
              "id": 2,
              "name": "Veggie",
              "isGlutenFree": true
          }
      ]
    
  6. Ha egyetlen pizzát szeretne lekérdezni, egy másik GET kérést is megadhat, de a következő paranccsal adhat meg egy id paramétert:

    get 1
    

    Az előző parancs a következő kimenettel tér vissza Classic Italian :

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  7. Az API olyan helyzeteket is kezel, amikor az elem nem létezik. Hívja meg újra az API-t, de adjon meg egy érvénytelen pizzaparamétert id a következő paranccsal:

    get 5
    

    Az előző parancs egy 404 Not Found hibát ad vissza a következő kimenettel:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    
  8. Térjen vissza a dotnet terminálra a Visual Studio Code legördülő listájában, és állítsa le a webes API-t a CTRL+C billentyűkombinációval a billentyűzeten.

Most, hogy befejezte az igék implementálását GET . A következő leckében további műveleteket adhat hozzá a CRUD-műveletek támogatásához PizzaController a pizzaadatokon.