Exercici: Addició d'un controlador

Un controlador és una classe pública amb un o diversos mètodes públics anomenats accions . Per convenció, es col·loca un controlador al directori Controllers de l'arrel del projecte. Les accions s'exposen com a punts de connexió HTTP dins del controlador d'API web.

Creació d'un controlador

  1. Seleccioneu la carpeta Controladors al Visual Studio Code i afegiu un fitxer nou anomenat PizzaController.cs .

    Captura de pantalla de Visual Studio Code que mostra l'addició d'un fitxer nou a la carpeta Controladors.

    Es crea un fitxer de classe buit de nom ProductsController.cs al directori Controllers . El nom del directori Controladors és una convenció. El nom del directori procedeix de l'arquitectura Model-Vista- Controlador que utilitza l'API web.

    Nota

    Per convenció, els noms de classe dels controladors porten el sufix Controller .

  2. Afegiu el codi següent a Controllers/PizzaController.cs . Deseu els canvis.

    C#
    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
    }
    

    Com heu après anteriorment, aquesta classe es deriva de ControllerBase, la classe base per treballar amb sol·licituds HTTP d'ASP.NET Core. També inclou els dos atributs estàndard sobre els quals heu après: [ApiController]i [Route]. Com abans, l'atribut [Route]defineix una assignació al token [controller]. Atès que aquesta classe de controlador s'anomena PizzaController, aquest controlador controla les sol·licituds a https://localhost:{PORT}/pizza.

Obtenció de totes les pizzes

El primer verb REST que cal implementar és GET, amb què un client pot obtenir totes les pizzes de l'API. L'atribut integrat es pot utilitzar [HttpGet]per definir un mètode que retorni les pizzes del servei.

Reemplaceu el comentari // GET all actionde Controllers/ProductsController.cs pel codi següent:

C#
[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

L'acció anterior:

  • Respon només al verb HTTP GET, tal com indica l'atribut [HttpGet].
  • Retorna una instància ActionResultde tipus List<Pizza>. El tipus ActionResultés la classe base per a tots els resultats dacció a ASP.NET Core.
  • Consulta el servei a la recerca de totes les pizzes i torna automàticament les dades del qual Content-Typeés application/json.

Recuperació d´una única pizza

Es posible que el cliente también quiera solicitar información sobre una pizza específica en lugar de toda la lista. Se puede implementar otra acciónGET que requiera un parámetro id. Se puede usar el atributo integrado [HttpGet("{id}")] para definir un método que devuelva las pizzas del servicio. La lógica de enrutamiento registra [HttpGet] (sin id) y [HttpGet("{id}")] (con id) como dos rutas diferentes. A continuación, puede escribir una acción independiente para recuperar un solo elemento.

Reemplace el comentario // GET by Id action de Controllers/ProductsController.cs por el siguiente código:

C#
[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

L'acció anterior:

  • Respon només al verb HTTP [HttpGet], tal i como indica l'atribut GET.
  • Requereix que s'inclogui el valor del paràmetro id en el segment de URL deprés de pizza/. Recuerdi que l'atribut /pizza de nivell de controlador ha definit el patró [Route].
  • Consulta la base de dades en busca d'una pizza que coincideixi amb el paràmetre id proporcionat.

Cada instancia ActionResult usada en l'acció anterior s'assigna al codi d'estat HTTP corresponent en la taula següent.

Resultat de l'acció
de ASP.NET Core
Codi d'estat HTTP Descripció
Ok está implícito 200 Hi ha un producte que coincideixi amb el paràmetre id proporcionat en la caché en memoria.
El producte s'inclou en el cos de la respuesta en el tipus multimedia que se defineix en el encapcelat de solicitud HTTP accept (JSON de forma predeterminada).
NotFound 404 No hi ha cap producte que coincideixi con el paràmetre id proporcionat a la caché en memoria.

Compilació i prova del controlador

  1. Ejecute el siguiente comando para compilar e iniciar la API web:

    CLI de .NET
    dotnet run
    
  2. Abra el terminal httprepl existente o uno nuevo integrado desde Visual Studio Code seleccionando Terminal>Nuevo terminal en el menú principal.

  3. Conéctese a la API web mediante el comando siguiente:

    CLI de .NET
    httprepl https://localhost:{PORT}
    

    Como alternativa, ejecute el siguiente comando en cualquier momento mientras HttpRepl se ejecuta:

    CLI de .NET
    connect https://localhost:{PORT}
    
  4. Para ver el punto de conexión de Pizza ya disponible, ejecute el siguiente comando:

    CLI de .NET
    ls
    

    El comando anterior detecta todas las API disponibles en el punto de conexión conectado. Debería mostrar el código siguiente:

    Resultados
     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  5. Ejecute el comando siguiente para ir al punto de conexión Pizza:

    CLI de .NET
    cd Pizza
    

    El comando anterior muestra una salida de las API disponibles para el punto de conexión Pizza:

    Resultados
    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  6. Realice una solicitud GET en HttpRepl usando el comando siguiente:

    CLI de .NET
    get
    

    El comando anterior devuelve una lista de todas las pizzas de JSON:

    Resultados
      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
          }
      ]
    
  7. Para consultar en busca de una sola pizza, se puede realizar otra solicitud GET, pero pase un parámetro id usando el comando siguiente:

    CLI de .NET
    get 1
    

    L'ordre anterior torna Classic Italianamb la sortida següent.

    Resultats
    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
    }
    
  8. L'API també controla situacions on l'element no existeix. Truqueu a l'API de nou, però passi un paràmetre idde pizza no vàlid amb la següent ordre:

    CLI de .NET
    get 5
    

    L'ordre anterior torna un error 404 Not Foundamb la sortida següent:

    Resultats
    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"
    }
    
  9. Torneu al terminal dotneta la llista desplegable del Visual Studio Code i apagueu l'API web prement CTRL+C al teclat.

Ja ha acabat d'implementar els verbs GET. A la unitat següent, podeu afegir més accions a PizzaControllerper admetre operacions CRUD en dades de pizza.


Mòdul completat:

Següent