Cvičení – přidání kontroleru
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
Vyberte složku
Controllersv Visual Studio Code a přidejte nový soubor s názvemPizzaController.cs.
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.
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řídaPizzaControllerkontroleru má název , zpracovává požadavkyhttp://localhost:5000/pizzana 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-Typeaapplication/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,
idaby hodnota parametru byla v segmentu adresy URL zapizza/. Nezapomeňte, že vzor/pizzabyl definován atributem[Route]na úrovni kontroleru. - Dotazuje se databáze na pizzu odpovídající zadanému
idparametru.
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
Sestavte a spusťte webové rozhraní API spuštěním následujícího příkazu:
dotnet runOtevř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).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
- 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]
- 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]
- V
GETHttpRepl 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
}
]
Při dotazování na jednu pizzu můžeme vytvořit další požadavek, ale předat parametr
GETidpomocí následujícího příkazu:get 1Vrátí se s
Classic Italianná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 }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
idneplatnou pizzu.get 5Vrátí se chyba
404 Not Founds 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" }Vraťte se do terminálu v rozevíracím seznamu Visual Studio Code a vypněte stisknutím klávesy
dotnetnaCTRL+Cklá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.
Potřebujete pomoc? Projděte si našeho průvodce odstraňováním potíží nebo nahlaste potíže a uveďte konkrétní připomínky.