Ö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 konvention har Controller-klassnamn 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 heterPizzaController
hanterar 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
ActionResult
instans 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-Type
application/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
id
parameterns värde ingår i URL-segmentet efterpizza/
. Kom ihåg att attributet på kontrollantnivå[Route]
definierade/pizza
mönstret. - Frågar databasen efter en pizza som matchar den angivna
id
parametern.
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
Pizza
slutpunkten 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
GET
begäran, men skicka in enid
parameter med hjälp av följande kommando:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###
Föregående kommando returneras
Classic Italian
med 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
id
med hjälp av följande kommando:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###
Föregående kommando returnerar ett
404 Not Found
fel 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
httprepl
terminalen 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
HttpRepl
det körs:connect https://localhost:{PORT}
Om du vill se den nyligen tillgängliga
Pizza
slutpunkten kör du följande kommando:ls
Fö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
Pizza
köra följande kommando:cd Pizza
Föregående kommando visar utdata från tillgängliga API:er för
Pizza
slutpunkten:https://localhost:{PORT}/> cd Pizza /Pizza [GET]
Gör en
GET
begäran medHttpRepl
hjälp av följande kommando:get
Fö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
GET
begäran, men skicka in enid
parameter med hjälp av följande kommando:get 1
Föregående kommando returneras
Classic Italian
med 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
id
med hjälp av följande kommando:get 5
Föregående kommando returnerar ett
404 Not Found
fel 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
dotnet
i 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.