Oefening - Een controller toevoegen

Voltooid

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

  1. Selecteer de map Controllers in Visual Studio Code en voeg een nieuw bestand toe met de naam PizzaController.cs.

    Schermopname van Visual Studio Code met het toevoegen van een nieuw bestand aan de map Controllers.

    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.

  2. 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 naam PizzaControllerheeft, verwerkt deze controller aanvragen naar https://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 type List<Pizza>geretourneerd. Het ActionResult 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 van application/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 na pizza/. 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

  1. Open ContosoPizza.http

  2. Voeg een nieuwe GET toe om het Pizza eindpunt aan te roepen onder de ### seperator:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. 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
        }
    ]   
    
  4. Als u een query wilt uitvoeren op één pizza, kunt u nog een GET aanvraag indienen, maar een id 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
    }
    
  5. 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)

  1. Open de bestaande httprepl terminal of open een nieuwe geïntegreerde terminal vanuit Visual Studio Code door Terminal> te selecteren in het hoofdmenu.

  2. 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}
    
  3. 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]
    
  4. 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]
    
  5. Voer een GET aanvraag in HttpRepl 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
          }
      ]
    
  6. Als u een query wilt uitvoeren op één pizza, kunt u nog een GET aanvraag indienen, maar een id 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
    }
    
  7. 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"
    }
    
  8. 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.