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 naamPizzaControllerheeft, 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
ActionResulttypeList<Pizza>geretourneerd. HetActionResulttype 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-Typewaarde 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
idparameter wordt opgenomen in het URL-segment napizza/. Onthoud dat het kenmerk op controllerniveau[Route]het/pizzapatroon heeft gedefinieerd. - Query's uitvoeren op de database voor een pizza die overeenkomt met de opgegeven
idparameter.
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
Pizzaeindpunt 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
GETaanvraag indienen, maar eenidparameter doorgeven met behulp van de volgende opdracht:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###De voorgaande opdracht retourneert
Classic Italianmet 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
iddoor met behulp van de volgende opdracht:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###De voorgaande opdracht retourneert een
404 Not Foundfout 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
httpreplterminal of open een nieuwe geïntegreerde terminal vanuit Visual Studio Code door Terminalselecteren 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
HttpRepldeze wordt uitgevoerd:connect https://localhost:{PORT}Voer de volgende opdracht uit om het zojuist beschikbare
Pizzaeindpunt weer te geven:lsMet 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
Pizzaeindpunt door de volgende opdracht uit te voeren:cd PizzaDe voorgaande opdracht toont een uitvoer van beschikbare API's voor het
Pizzaeindpunt:https://localhost:{PORT}/> cd Pizza /Pizza [GET]Voer een
GETaanvraag inHttpReplmet behulp van de volgende opdracht:getMet 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
GETaanvraag indienen, maar eenidparameter doorgeven met behulp van de volgende opdracht:get 1De voorgaande opdracht retourneert
Classic Italianmet 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
iddoor met behulp van de volgende opdracht:get 5De voorgaande opdracht retourneert een
404 Not Foundfout 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
dotnetterminal 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.