Övning – Lägga till en kontrollant

Slutförd

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

  1. Välj mappen Controllers i Visual Studio Code och lägg till en ny fil med namnet PizzaController.cs.

    Skärmbild av Visual Studio Code som visar hur du lägger till en ny fil i mappen Controllers.

    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.

  2. 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 heter PizzaControllerhanterar den här kontrollanten begäranden till https://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 typen List<Pizza>. Typen ActionResult ä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 efter pizza/. 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

  1. Öppna ContosoPizza.http

  2. Lägg till en ny GET för att anropa Pizza slutpunkten under ### seperatorn:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. 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
        }
    ]   
    
  4. Om du vill fråga efter en enda pizza kan du göra en annan GET begäran, men skicka in en id 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
    }
    
  5. 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)

  1. Ö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.

  2. 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}
    
  3. 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]
    
  4. 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]
    
  5. Gör en GET begäran med HttpRepl 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
          }
      ]
    
  6. Om du vill fråga efter en enda pizza kan du göra en annan GET begäran, men skicka in en id 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
    }
    
  7. 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"
    }
    
  8. 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.