Oefening - Een controller toevoegen
Een controller is een openbare klasse met een of meer openbare methoden die acties worden genoemd. Volgens de conventie wordt een controller in de map Controllers van de projecthoofdmap geplaatst. De acties worden weergegeven als HTTP-eindpunten in de web-API-controller.
Een controller maken
Selecteer de map Controllers in Visual Studio Code en voeg een nieuw bestand toe met de naam PizzaController.cs.
Er wordt een leeg klassebestand met de naam PizzaController.cs gemaakt in de map Controllers . De naam van de map Controllers is een conventie. De mapnaam is afkomstig van de modelweergave-controllerarchitectuur die door de web-API wordt gebruikt.
Notitie
Controllerklassenamen worden volgens de conventies voorafgegaan door Controller.
Voeg de volgende code toe aan Controllers/PizzaController.cs. Sla uw wijzigingen op.
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 }
Zoals u eerder hebt geleerd, is deze klasse afgeleid van
ControllerBase
, de basisklasse voor het werken met HTTP-aanvragen in ASP.NET Core. Het bevat ook de twee standaardkenmerken die u hebt geleerd over:[ApiController]
en[Route]
. Net als voorheen definieert het[Route]
kenmerk een toewijzing aan het[controller]
token. Omdat deze controllerklasse een naamPizzaController
heeft, verwerkt deze controller aanvragen naarhttps://localhost:{PORT}/pizza
.
Alle pizza's ophalen
Het eerste REST-werkwoord dat u moet implementeren, is GET
, waar een client alle pizza's van de API kan ophalen. U kunt het ingebouwde [HttpGet]
kenmerk gebruiken om een methode te definiëren waarmee de pizza's van onze service worden geretourneerd.
Vervang de // GET all action
opmerking in Controllers/PizzaController.cs door de volgende code:
[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
PizzaService.GetAll();
De bovenstaande actie:
- Reageert alleen op het HTTP-woord
GET
, zoals aangegeven door het[HttpGet]
kenmerk. - Hiermee wordt een exemplaar van het
ActionResult
typeList<Pizza>
geretourneerd. HetActionResult
type is de basisklasse voor alle actieresultaten in ASP.NET Core. - Query's uitvoeren op de service voor alle pizza's en retourneert automatisch gegevens met een
Content-Type
waarde vanapplication/json
.
Eén pizza ophalen
De client wil mogelijk ook informatie over een specifieke pizza aanvragen in plaats van de hele lijst. U kunt een andere GET
actie implementeren waarvoor een id
parameter is vereist. U kunt het ingebouwde [HttpGet("{id}")]
kenmerk gebruiken om een methode te definiëren waarmee de pizza's van onze service worden geretourneerd. De routeringslogica registreert [HttpGet]
(zonder id
) en [HttpGet("{id}")]
(met id
) als twee verschillende routes. Vervolgens kunt u een afzonderlijke actie schrijven om één item op te halen.
Vervang de // GET by Id action
opmerking in Controllers/PizzaController.cs door de volgende code:
[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
var pizza = PizzaService.Get(id);
if(pizza == null)
return NotFound();
return pizza;
}
De bovenstaande actie:
- Reageert alleen op het HTTP-woord
GET
, zoals aangegeven door het[HttpGet]
kenmerk. - Vereist dat de waarde van de
id
parameter wordt opgenomen in het URL-segment napizza/
. Onthoud dat het kenmerk op controllerniveau[Route]
het/pizza
patroon heeft gedefinieerd. - Query's uitvoeren op de database voor een pizza die overeenkomt met de opgegeven
id
parameter.
Elk ActionResult
exemplaar dat in de voorgaande actie wordt gebruikt, wordt toegewezen aan de bijbehorende HTTP-statuscode in de volgende tabel:
ASP.NET Core resultaat van actie |
HTTP-statuscode | Beschrijving |
---|---|---|
Ok wordt geïmpliceerd |
200 | Er bestaat een product dat overeenkomt met de opgegeven id parameter in de cache in het geheugen.Het product is opgenomen in de hoofdtekst van het antwoord in het mediatype, zoals gedefinieerd in de accept HTTP-aanvraagheader (standaard JSON). |
NotFound |
404 | Een product dat overeenkomt met de opgegeven id parameter, bestaat niet in de cache in het geheugen. |
De nieuwe controller bouwen en uitvoeren
Bouw en start de web-API door de volgende opdracht uit te voeren:
dotnet run
De controller testen met een HTTP-bestand
Open ContosoPizza.http
Voeg een nieuwe GET toe om het
Pizza
eindpunt aan te roepen onder de ### seperator:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
Selecteer de opdracht Aanvraag verzenden boven deze nieuwe GET-aanroep .
Met de voorgaande opdracht wordt een lijst met alle pizza's in JSON geretourneerd:
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 } ]
Als u een query wilt uitvoeren op één pizza, kunt u nog een
GET
aanvraag indienen, maar eenid
parameter doorgeven met behulp van de volgende opdracht:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###
De voorgaande opdracht retourneert
Classic Italian
met de volgende uitvoer: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 }
Onze API verwerkt ook situaties waarin het item niet bestaat. Roep de API opnieuw aan, maar geef een ongeldige pizzaparameter
id
door met behulp van de volgende opdracht:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###
De voorgaande opdracht retourneert een
404 Not Found
fout met de volgende uitvoer: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 u klaar bent met het implementeren van de GET
werkwoorden. In de volgende les kunt u meer acties toevoegen om CRUD-bewerkingen op pizzagegevens te PizzaController
ondersteunen.
Optioneel: de controller testen met opdrachtregel HTTP Read-Eval-Print Loop (REPL)
Open de bestaande
httprepl
terminal of open een nieuwe geïntegreerde terminal vanuit Visual Studio Code door Terminal> te selecteren in het hoofdmenu.Maak verbinding met onze web-API door de volgende opdracht uit te voeren:
httprepl https://localhost:{PORT}
U kunt ook de volgende opdracht op elk gewenst moment uitvoeren terwijl
HttpRepl
deze wordt uitgevoerd:connect https://localhost:{PORT}
Voer de volgende opdracht uit om het zojuist beschikbare
Pizza
eindpunt weer te geven:ls
Met de voorgaande opdracht worden alle API's gedetecteerd die beschikbaar zijn op het verbonden eindpunt. De volgende code moet worden weergegeven:
https://localhost:{PORT}/> ls . [] Pizza [GET] WeatherForecast [GET]
Ga naar het
Pizza
eindpunt door de volgende opdracht uit te voeren:cd Pizza
De voorgaande opdracht toont een uitvoer van beschikbare API's voor het
Pizza
eindpunt:https://localhost:{PORT}/> cd Pizza /Pizza [GET]
Voer een
GET
aanvraag inHttpRepl
met behulp van de volgende opdracht:get
Met de voorgaande opdracht wordt een lijst met alle pizza's in JSON geretourneerd:
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 } ]
Als u een query wilt uitvoeren op één pizza, kunt u nog een
GET
aanvraag indienen, maar eenid
parameter doorgeven met behulp van de volgende opdracht:get 1
De voorgaande opdracht retourneert
Classic Italian
met de volgende uitvoer: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 }
Onze API verwerkt ook situaties waarin het item niet bestaat. Roep de API opnieuw aan, maar geef een ongeldige pizzaparameter
id
door met behulp van de volgende opdracht:get 5
De voorgaande opdracht retourneert een
404 Not Found
fout met de volgende uitvoer: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" }
Ga terug naar de
dotnet
terminal in de vervolgkeuzelijst in Visual Studio Code en sluit de web-API af door Ctrl+C op het toetsenbord te selecteren.
Nu u klaar bent met het implementeren van de GET
werkwoorden. In de volgende les kunt u meer acties toevoegen om CRUD-bewerkingen op pizzagegevens te PizzaController
ondersteunen.