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
Seleccioneu la carpeta Controladors al Visual Studio Code i afegiu un fitxer nou anomenat PizzaController.cs .

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 .
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'anomenaPizzaController, aquest controlador controla les sol·licituds ahttps://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:
[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 tipusList<Pizza>. El tipusActionResulté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ésapplication/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:
[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'atributGET. - Requereix que s'inclogui el valor del paràmetro
iden el segment de URL deprés depizza/. Recuerdi que l'atribut/pizzade nivell de controlador ha definit el patró[Route]. - Consulta la base de dades en busca d'una pizza que coincideixi amb el paràmetre
idproporcionat.
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
Ejecute el siguiente comando para compilar e iniciar la API web:
CLI de .NETdotnet runAbra el terminal
httpreplexistente o uno nuevo integrado desde Visual Studio Code seleccionando Terminal>Nuevo terminal en el menú principal.Conéctese a la API web mediante el comando siguiente:
CLI de .NEThttprepl https://localhost:{PORT}Como alternativa, ejecute el siguiente comando en cualquier momento mientras
HttpReplse ejecuta:CLI de .NETconnect https://localhost:{PORT}Para ver el punto de conexión de
Pizzaya disponible, ejecute el siguiente comando:CLI de .NETlsEl comando anterior detecta todas las API disponibles en el punto de conexión conectado. Debería mostrar el código siguiente:
Resultadoshttps://localhost:{PORT}/> ls . [] Pizza [GET] WeatherForecast [GET]Ejecute el comando siguiente para ir al punto de conexión
Pizza:CLI de .NETcd PizzaEl comando anterior muestra una salida de las API disponibles para el punto de conexión
Pizza:Resultadoshttps://localhost:{PORT}/> cd Pizza /Pizza [GET]Realice una solicitud
GETenHttpReplusando el comando siguiente:CLI de .NETgetEl comando anterior devuelve una lista de todas las pizzas de JSON:
ResultadosHTTP/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 } ]Para consultar en busca de una sola pizza, se puede realizar otra solicitud
GET, pero pase un parámetroidusando el comando siguiente:CLI de .NETget 1L'ordre anterior torna
Classic Italianamb la sortida següent.ResultatsHTTP/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 }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 .NETget 5L'ordre anterior torna un error
404 Not Foundamb la sortida següent:ResultatsHTTP/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" }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.