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]. -
ActionResultVrátí instanci typuList<Pizza>. TypActionResultje 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-Typehodnotouapplication/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
idhodnota parametru byla zahrnuta do segmentu adresy URL zapizza/. Nezapomeňte, že atribut na úrovni[Route]kontroleru definoval/pizzavzor. - Dotazuje databázi na pizzu, která odpovídá zadanému
idparametru.
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
Pizzabodu 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ší
GETpožadavek, ale předatidparametr pomocí následujícího příkazu:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###Předchozí příkaz vrátí
Classic Italianná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í
httpreplterminá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
HttpReplspustit následující příkaz:connect https://localhost:{PORT}Pokud chcete zobrazit nově dostupný
Pizzakoncový bod, spusťte následující příkaz:lsPř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
Pizzabodu:cd PizzaPředchozí příkaz zobrazí výstup dostupných rozhraní API pro
Pizzakoncový bod:https://localhost:{PORT}/> cd Pizza /Pizza [GET]GETPomocí následujícího příkazu vytvořte požadavekHttpRepl:getPř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ší
GETpožadavek, ale předatidparametr pomocí následujícího příkazu:get 1Předchozí příkaz vrátí
Classic Italianná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 5Př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
dotnetterminá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.