Cvičení – přidání kontroleru

Dokončeno

Kontroler je veřejná třída s jednou nebo více veřejnými metodami známými jako akce. Podle konvence se kontroler umístí do kořenového adresáře kontrolerů projektu. Akce se zveřejňují jako koncové body HTTP v kontroleru webového rozhraní API.

Vytvoření kontroleru

  1. Vyberte složku Kontrolery v editoru Visual Studio Code a přidejte nový soubor s názvem PizzaController.cs.

    Snímek obrazovky editoru Visual Studio Code, který ukazuje přidání nového souboru do složky Kontrolery

    V adresáři Kontrolerů se vytvoří prázdný soubor třídy s názvem PizzaController.cs. Název adresáře Kontrolery je konvence. Název adresáře pochází z architektury kontroleru zobrazení modelu, kterou webové rozhraní API používá.

    Poznámka:

    Podle konvence se k názvům tříd kontrolerů přidává přípona Controller.

  2. Do kontrolerů/PizzaController.cs přidejte následující kód. Uložte provedené změny.

    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
    }
    

    Jak jste se dozvěděli dříve, tato třída je odvozena od ControllerBase, základní třída pro práci s požadavky HTTP v ASP.NET Core. Zahrnuje také dva standardní atributy, o které jste se dozvěděli: [ApiController] a [Route]. Stejně jako předtím [Route] definuje atribut mapování na [controller] token. Vzhledem k tomu, že tato třída kontroleru je pojmenována PizzaController, tento kontroler zpracovává požadavky na https://localhost:{PORT}/pizza.

Získat všechny pizzy

První příkaz REST, který potřebujete implementovat, je GET, kde klient může získat všechny pizzy z rozhraní API. Předdefinovaný [HttpGet] atribut můžete použít k definování metody, která vrací pizzy z naší služby.

// GET all action Nahraďte komentář v kontrolery/PizzaController.cs následujícím kódem:

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

Předcházející akce:

  • Reaguje pouze na příkaz HTTP GET , jak je označen atributem [HttpGet] .
  • ActionResult Vrátí instanci typu List<Pizza>. Typ ActionResult je základní třída pro všechny výsledky akcí ASP.NET Core.
  • Dotazuje službu na všechny pizzy a automaticky vrací data s Content-Type hodnotou application/json.

Načtení jedné pizzy

Klient si může také vyžádat informace o konkrétní pizze místo celého seznamu. Můžete implementovat další GET akci, která vyžaduje id parametr. Předdefinovaný [HttpGet("{id}")] atribut můžete použít k definování metody, která vrací pizzy z naší služby. Logika směrování se zaregistruje [HttpGet] (bez id) a [HttpGet("{id}")] (s id) jako dvě různé trasy. Pak můžete napsat samostatnou akci, která načte jednu položku.

// GET by Id action Nahraďte komentář v kontrolery/PizzaController.cs následujícím kódem:

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

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

    return pizza;
}

Předcházející akce:

  • Reaguje pouze na příkaz HTTP GET , jak je označen atributem [HttpGet] .
  • Vyžaduje, aby id hodnota parametru byla zahrnuta do segmentu adresy URL za pizza/. Nezapomeňte, že atribut na úrovni [Route] kontroleru definoval /pizza vzor.
  • Dotazuje databázi na pizzu, která odpovídá zadanému id parametru.

Každá ActionResult instance použitá v předchozí akci se mapuje na odpovídající stavový kód HTTP v následující tabulce:

ASP.NET Core
ASP.NET Core
Stavový kód HTTP Popis
Implikuje se Ok. 200 Produkt, který odpovídá zadanému id parametru, existuje v mezipaměti v paměti.
Produkt je součástí textu odpovědi v typu média, jak je definováno v accept hlavičce požadavku HTTP (ve výchozím nastavení JSON).
NotFound 404 Produkt, který odpovídá zadanému id parametru, neexistuje v mezipaměti v paměti.

Sestavení a spuštění nového kontroleru

Spuštěním následujícího příkazu sestavte a spusťte webové rozhraní API:

dotnet run

Otestování kontroleru pomocí souboru HTTP

  1. Otevření ContosoPizza.http

  2. Přidejte nový GET pro volání koncového Pizza bodu pod seperátorem ### :

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. Vyberte příkaz Odeslat požadavek nad tímto novým voláním GET.

    Předchozí příkaz vrátí seznam všech pizz ve formátu JSON:

    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. Pokud chcete zadat dotaz na jednu pizzu, můžete vytvořit další GET požadavek, ale předat id parametr pomocí následujícího příkazu:

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

    Předchozí příkaz vrátí Classic Italian následující výstup:

    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. Naše rozhraní API také zpracovává situace, kdy položka neexistuje. Znovu zavolejte rozhraní API, ale pomocí následujícího příkazu předejte neplatný parametr pizzy id :

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

    Předchozí příkaz vrátí chybu s následujícím výstupem 404 Not Found :

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

Teď, když jste dokončili implementaci GET sloves. V další lekci můžete přidat další akce pro PizzaController podporu operací CRUD s daty pizzy.

Volitelné: Otestování kontroleru pomocí smyčky HTTP read-Eval-Print (REPL) příkazového řádku

  1. Otevřete existující httprepl terminál nebo otevřete nový integrovaný terminál v editoru Visual Studio Code tak, že v hlavní nabídce vyberete Terminál>nový terminál.

  2. Připojte se k webovému rozhraní API spuštěním následujícího příkazu:

    httprepl https://localhost:{PORT}
    

    Případně můžete při spuštění kdykoli HttpRepl spustit následující příkaz:

    connect https://localhost:{PORT}
    
  3. Pokud chcete zobrazit nově dostupný Pizza koncový bod, spusťte následující příkaz:

    ls
    

    Předchozí příkaz zjistí všechna rozhraní API dostupná na připojeném koncovém bodu. Měl by zobrazit následující kód:

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. Spuštěním následujícího příkazu přejděte ke koncovému Pizza bodu:

    cd Pizza
    

    Předchozí příkaz zobrazí výstup dostupných rozhraní API pro Pizza koncový bod:

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. GET Pomocí následujícího příkazu vytvořte požadavekHttpRepl:

    get
    

    Předchozí příkaz vrátí seznam všech pizz ve formátu JSON:

      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. Pokud chcete zadat dotaz na jednu pizzu, můžete vytvořit další GET požadavek, ale předat id parametr pomocí následujícího příkazu:

    get 1
    

    Předchozí příkaz vrátí Classic Italian následující výstup:

    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. Naše rozhraní API také zpracovává situace, kdy položka neexistuje. Znovu zavolejte rozhraní API, ale pomocí následujícího příkazu předejte neplatný parametr pizzy id :

    get 5
    

    Předchozí příkaz vrátí chybu s následujícím výstupem 404 Not Found :

    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. Vraťte se do dotnet terminálu v rozevíracím seznamu v editoru Visual Studio Code a vypněte webové rozhraní API tak, že na klávesnici vyberete CTRL+C.

Teď, když jste dokončili implementaci GET sloves. V další lekci můžete přidat další akce pro PizzaController podporu operací CRUD s daty pizzy.