Övning – Lägga till en kontrollant
En kontrollant är en offentlig klass med en eller flera offentliga metoder som kallas åtgärder. Enligt konventionen placeras en kontrollant i projektrotens katalog Controllers . Åtgärderna exponeras som HTTP-slutpunkter i webb-API-kontrollanten.
Skapa en kontrollant
Välj mappen Controllers i Visual Studio Code och lägg till en ny fil med namnet PizzaController.cs.
En tom klassfil med namnet PizzaController.cs skapas i katalogen Controllers . Katalognamnet controllers är en konvention. Katalognamnet kommer från arkitekturen model-view-controller som webb-API:et använder.
Kommentar
Enligt konventionen har namn på kontrollerklasser suffixet Controller.
Lägg till följande kod i Controllers/PizzaController.cs. Spara dina ändringar.
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 }Som du lärde dig tidigare härleds den här klassen från
ControllerBase, basklassen för att arbeta med HTTP-begäranden i ASP.NET Core. Den innehåller även de två standardattribut som du har lärt dig om:[ApiController]och[Route]. Som tidigare[Route]definierar attributet en mappning till[controller]token. Eftersom den här kontrollantklassen heterPizzaControllerhanterar den här kontrollanten begäranden tillhttps://localhost:{PORT}/pizza.
Hämta alla pizzor
Det första REST-verbet som du behöver implementera är GET, där en klient kan hämta alla pizzor från API:et. Du kan använda det inbyggda [HttpGet] attributet för att definiera en metod som returnerar pizza från vår tjänst.
Ersätt kommentaren // GET all action i Controllers/PizzaController.cs med följande kod:
[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
PizzaService.GetAll();
Föregående åtgärd:
- Svarar endast på HTTP-verbet
GET, vilket anges av[HttpGet]attributet. - Returnerar en
ActionResultinstans av typenList<Pizza>. TypenActionResultär basklassen för alla åtgärdsresultat i ASP.NET Core. - Frågar tjänsten efter all pizza och returnerar automatiskt data med värdet
Content-Typeapplication/json.
Hämta en enda pizza
Klienten kanske också vill begära information om en specifik pizza i stället för hela listan. Du kan implementera en annan GET åtgärd som kräver en id parameter. Du kan använda det inbyggda [HttpGet("{id}")] attributet för att definiera en metod som returnerar pizza från vår tjänst. Routningslogik [HttpGet] registreras (utan id) och [HttpGet("{id}")] (med id) som två olika vägar. Du kan sedan skriva en separat åtgärd för att hämta ett enskilt objekt.
Ersätt kommentaren // GET by Id action i Controllers/PizzaController.cs med följande kod:
[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
var pizza = PizzaService.Get(id);
if(pizza == null)
return NotFound();
return pizza;
}
Föregående åtgärd:
- Svarar endast på HTTP-verbet
GET, vilket anges av[HttpGet]attributet. - Kräver att
idparameterns värde ingår i URL-segmentet efterpizza/. Kom ihåg att attributet på kontrollantnivå[Route]definierade/pizzamönstret. - Frågar databasen efter en pizza som matchar den angivna
idparametern.
Varje ActionResult instans som används i föregående åtgärd mappas till motsvarande HTTP-statuskod i följande tabell:
| ASP.NET Core åtgärdsresultat |
HTTP-statuskod | beskrivning |
|---|---|---|
Ok är underförstått |
200 | En produkt som matchar den angivna id parametern finns i minnesintern cache.Produkten ingår i svarstexten i medietypen enligt definitionen i accept HTTP-begärandehuvudet (JSON som standard). |
NotFound |
404 | En produkt som matchar den angivna id parametern finns inte i minnesintern cache. |
Skapa och kör den nya kontrollanten
Skapa och starta webb-API:et genom att köra följande kommando:
dotnet run
Testa kontrollanten med en Http-fil
Öppna ContosoPizza.http
Lägg till en ny GET för att anropa
Pizzaslutpunkten under ### seperatorn:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###Välj kommandot Skicka begäran ovanför det nya GET-anropet .
Föregående kommando returnerar en lista över alla pizzor i 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 } ]Om du vill fråga efter en enda pizza kan du göra en annan
GETbegäran, men skicka in enidparameter med hjälp av följande kommando:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###Föregående kommando returneras
Classic Italianmed följande utdata: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 }Vårt API hanterar även situationer där objektet inte finns. Anropa API:et igen, men skicka in en ogiltig pizzaparameter
idmed hjälp av följande kommando:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###Föregående kommando returnerar ett
404 Not Foundfel med följande utdata: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" }
Nu när du har implementerat verben GET . I nästa lektion kan du lägga till fler åtgärder för att PizzaController stödja CRUD-åtgärder på pizzadata.
Valfritt: Testa kontrollanten med kommandoraden HTTP Read-Eval-Print Loop (REPL)
Öppna den befintliga
httpreplterminalen eller öppna en ny integrerad terminal från Visual Studio Code genom att välja Terminal>Ny terminal på huvudmenyn.Anslut till vårt webb-API genom att köra följande kommando:
httprepl https://localhost:{PORT}Du kan också köra följande kommando när som helst medan
HttpRepldet körs:connect https://localhost:{PORT}Om du vill se den nyligen tillgängliga
Pizzaslutpunkten kör du följande kommando:lsFöregående kommando identifierar alla API:er som är tillgängliga på den anslutna slutpunkten. Den bör visa följande kod:
https://localhost:{PORT}/> ls . [] Pizza [GET] WeatherForecast [GET]Gå till slutpunkten genom att
Pizzaköra följande kommando:cd PizzaFöregående kommando visar utdata från tillgängliga API:er för
Pizzaslutpunkten:https://localhost:{PORT}/> cd Pizza /Pizza [GET]Gör en
GETbegäran medHttpReplhjälp av följande kommando:getFöregående kommando returnerar en lista över alla pizzor i 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 } ]Om du vill fråga efter en enda pizza kan du göra en annan
GETbegäran, men skicka in enidparameter med hjälp av följande kommando:get 1Föregående kommando returneras
Classic Italianmed följande utdata: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 }Vårt API hanterar även situationer där objektet inte finns. Anropa API:et igen, men skicka in en ogiltig pizzaparameter
idmed hjälp av följande kommando:get 5Föregående kommando returnerar ett
404 Not Foundfel med följande utdata: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" }Gå tillbaka till terminalen
dotneti listrutan i Visual Studio Code och stäng webb-API:et genom att välja CTRL+C på tangentbordet.
Nu när du har implementerat verben GET . I nästa lektion kan du lägga till fler åtgärder för att PizzaController stödja CRUD-åtgärder på pizzadata.