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

Dokončeno

Kontroler je veřejná třída s jednou nebo více veřejnými metodami, které se říká akce. Podle konvence je kontroler umístěný v kořenovém adresáři projektu Controllers. Akce jsou zveřejněné jako koncové body HTTP uvnitř kontroleru webového rozhraní API.

Vytvoření kontroleru

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

    Obrázek Visual Studio Code přidání nového souboru do složky Kontrolery

    V adresáři Controllers se vytvoří prázdný soubor třídy s názvem PizzaController.cs. Název adresáře Controllers je konvence. Název adresáře pochází z architektury Model-View-Controller, kterou používá webové rozhraní API.

    Poznámka

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

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

    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.AspNetCore.Mvc;
    using ContosoPizza.Models;
    using ContosoPizza.Services;
    
    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 z ControllerBase, základní třídy pro práci s požadavky HTTP ASP.NET Core. Obsahuje také dva standardní atributy, o které jste se dozvěděli, a [ApiController] [Route] . Stejně jako předtím [Route] atribut definuje mapování na [controller] token. Vzhledem k tomu, že tato třída PizzaController kontroleru má název , zpracovává požadavky http://localhost:5000/pizza na tento kontroler.

Get all pizzas (Získat všechny pizzy)

První příkaz REST, který potřebujeme implementovat, je místo, kde klient může z rozhraní API získat GET všechny pizzy. Pomocí integrovaného atributu můžeme [HttpGet] definovat metodu, která vrátí pizzy z naší služby.

Nahraďte // GET all action komentář v souboru Controllers/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 označuje atribut [HttpGet].
  • Dotazuje se služby na všechny pizzy a automaticky vrátí data s Content-Type a application/json .

Načtení jedné pizzy

Klient může také chtít požádat o získání informací o konkrétní pizzu místo celého seznamu. Můžeme implementovat další GET akci, která vyžaduje id . Pomocí integrovaného atributu můžeme [HttpGet("{id}")] definovat metodu, která vrátí pizzy z naší služby. Logika směrování registruje (bez ) a (s ) jako dvě různé trasy, což nám umožňuje napsat samostatnou akci pro [HttpGet] id načtení jedné [HttpGet("{id}")] id položky.

Nahraďte // GET by Id action komentář v souboru Controllers/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 označuje atribut [HttpGet].
  • Vyžaduje, id aby hodnota parametru byla v segmentu adresy URL za pizza/ . Nezapomeňte, že vzor /pizza byl definován atributem [Route] na úrovni kontroleru.
  • Dotazuje se databáze na pizzu odpovídající zadanému id parametru.

Každý výsledek akce (ActionResult) použitý v předchozí akci se namapuje k odpovídajícímu stavovému kódu HTTP v následující tabulce.

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

Sestavení a otestování kontroleru

  1. Sestavte a spusťte webové rozhraní API spuštěním následujícího příkazu:

    dotnet run
    
  2. Otevřete existující terminál nebo otevřete nový integrovaný terminál z Visual Studio Code tak, že v hlavní nabídce vyberete Terminal New Terminal (Terminál httprepl > nový terminál).

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

httprepl http://localhost:5000

Alternatively, run the following command at any time while the HttpRepl is running:

For example:

```dotnetcli
(Disconnected)> connect http://localhost:5000
  1. Pokud chcete zobrazit náš nově dostupný koncový bod pizzy, spusťte následující příkaz:
ls

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

 http://localhost:5000/> ls
 .                 []
 Pizza             [GET]
 WeatherForecast   [GET]
  1. Spuštěním následujícího příkazu přejděte do koncového bodu Pizza:
cd Pizza

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

http://localhost:5000/> cd Pizza
/Pizza    [GET]
  1. V GET HttpRepl vytvořte požadavek pomocí následujícího příkazu:
get

Následující příkaz vyžádá GET požadavek a vrátí seznam všech pizz v 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
      }
  ]
  1. Při dotazování na jednu pizzu můžeme vytvořit další požadavek, ale předat parametr GET id pomocí následujícího příkazu:

    get 1
    

    Vrátí se s Classic Italian následujícím výstupem:

    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
    }
    
  2. Naše rozhraní API také řeší situace, kdy položka neexistuje. Znovu zavoláme rozhraní API, ale pomocí následujícího příkazu předáme id neplatnou pizzu.

    get 5
    

    Vrátí se chyba 404 Not Found s následujícím výstupem:

    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"
    }
    
  3. Vraťte se do terminálu v rozevíracím seznamu Visual Studio Code a vypněte stisknutím klávesy dotnet na CTRL+C klávesnici webové rozhraní API.

Dokončili jsme implementaci operací a v další jednotce můžeme přidat další akce pro podporu operací CRUD s našimi daty o GET PizzaController pizze.