Cvičení – přidání kontroleru
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
Vyberte složku Kontrolery v editoru Visual Studio Code a přidejte nový soubor s názvem PizzaController.cs.
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.
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ánaPizzaController
, tento kontroler zpracovává požadavky nahttps://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 typuList<Pizza>
. TypActionResult
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
hodnotouapplication/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 zapizza/
. 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
Otevření ContosoPizza.http
Přidejte nový GET pro volání koncového
Pizza
bodu pod seperátorem ### :GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
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 } ]
Pokud chcete zadat dotaz na jednu pizzu, můžete vytvořit další
GET
požadavek, ale předatid
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 }
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
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.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}
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]
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]
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 } ]
Pokud chcete zadat dotaz na jednu pizzu, můžete vytvořit další
GET
požadavek, ale předatid
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 }
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" }
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.