Exercici: Implementació d'operacions CRUD
Seguirem ampliant el controlador d'API web per afegir la capacitat de crear ( POST), actualitzar ( PUT) i eliminar ( DELETE) pizzes a l'inventari.
Incorporació d´una pizza
Habilitem una pizza per afegir-la a través de l'API web mitjançant un mètode POST.
Reemplaceu el comentari // POST actionde Controllers/PizzaController.cs pel codi següent:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
L'acció anterior:
- Respon només al verb HTTP
POST, tal com indica l'atribut[HttpPost]. - Insereix l'objecte
Pizzadel cos de la sol·licitud a la memòria cau en memòria.
Nota
Atès que el controlador s'anota amb l'atribut [ApiController], està implícit que el paràmetre Pizzaes trobarà al cos de la sol·licitud.
El primer paràmetre de la trucada al mètode CreatedAtActionrepresenta un nom dacció. Es fa servir la paraula clau nameofper evitar codificar de manera rígida el nom de l'acció. CreatedAtActionutilitza el nom de l'acció per generar una capçalera de resposta HTTP locationamb una adreça URL a la pizza acabada de crear, com s'ha explicat a la unitat anterior.
Modificació d´una pizza
Ara habilitem una pizza per actualitzar-la a través de l'API web mitjançant un mètode PUT.
Reemplaceu el comentari // PUT actionde Controllers/PizzaController.cs pel codi següent:
[HttpPut("{id}")]
public IActionResult Update(int id, Pizza pizza)
{
if (id != pizza.Id)
return BadRequest();
var existingPizza = PizzaService.Get(id);
if(existingPizza is null)
return NotFound();
PizzaService.Update(pizza);
return NoContent();
}
L'acció anterior:
- Només respon al verb HTTP PUT, tal com indica l'atribut
[HttpPut]. - Cal que s'inclogui el valor del paràmetre
idal segment d'URL després depizza/. - Torna
IActionResultperquè no es coneix el tipus de valor tornatActionResultfins al temps d'execució. Els mètodesBadRequest,NotFoundiNoContentretornen els tipusBadRequestResult,NotFoundResultiNoContentResult, respectivament.
Nota
Com que el controlador s'anota amb l'atribut [ApiController], està implícit que el paràmetre Pizzaes trobarà al cos de la sol·licitud.
Eliminació d´una pizza
Finalment, habilitem una pizza per treure-la a través de l'API web mitjançant un mètode DELETE.
Reemplaceu el comentari // DELETE actionde Controllers/PizzaController.cs pel codi següent:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
L'acció anterior:
- Respon només al verb HTTP
[HttpDelete], tal com indica l'atributDELETE. - Cal que s'inclogui el valor del paràmetre
idal segment d'URL després depizza/. - Torna
IActionResultperquè no es coneix el tipus de valor tornatActionResultfins al temps d'execució. Els mètodesNotFoundiNoContentretornen els tipusNotFoundResultiNoContentResult, respectivament. - Consulta la memòria cau en memòria a la recerca d'una pizza que coincideixi amb el paràmetre
idproporcionat.
No oblideu desar el fitxer Controllers/PizzaController.cs abans de continuar.
Compilació i execució de l'API web acabada
Executeu l'ordre següent per compilar i iniciar l'API web:
CLI de .NETdotnet runTorneu a obrir el terminal
httpreplexistent o un de nou integrat des del Visual Studio Code seleccionant Terminal > Nou terminal al menú principal.Si heu obert un nou terminal, connecteu-vos a l'API web executant la següent ordre:
CLI de .NEThttprepl https://localhost:{PORT}Com a alternativa, executeu la següent ordre en qualsevol moment mentre
HttpRepls'executa:CLI de .NETconnect https://localhost:{PORT}Executeu l'ordre següent per anar al punt de connexió
Pizza:CLI de .NETcd PizzaExecuteu l'ordre següent per veure les noves accions a l'API Pizza:
CLI de .NETlsL'ordre anterior mostra una sortida de les API disponibles per al punt de connexió
Pizza:Resultatshttps://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Feu una sol·licitud
POSTper afegir una pizza nova fent servirHttpRepll'ordre següent:CLI de .NETpost -c "{"name":"Hawaii", "isGlutenFree":false}"L'ordre anterior torna una llista de totes les pizzes:
ResultatsHTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:23:09 GMT Location: https://localhost:{PORT}/Pizza?id=3 Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }Actualitzeu la nova pizza
Hawaiia unaHawaiianamb una sol·licitudPUTamb la següent ordre:CLI de .NETput 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"L'ordre anterior torna la sortida següent que indica que s'ha fet correctament:
ResultatsHTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: KestrelPer comprovar que la pizza s'ha actualitzat, torneu a executar l'acció
GETamb la següent ordre:CLI de .NETget 3La comanda anterior torna la pizza recent actualitzada:
ResultatsHTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:27:37 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaiian", "isGlutenFree": false }L'API també pot eliminar la pizza acabada de crear amb l'acció
DELETEsi executeu l'ordre següent:CLI de .NETdelete 3La comanda anterior torna un resultat
204 No Contentsi és correcte:ResultatsHTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPer comprovar que la pizza s'ha tret, torneu a executar l'acció
GETamb la següent ordre:CLI de .NETgetLa comanda anterior torna les pizzes originals com a resultats:
ResultatsHTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:31:15 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]
Ja s'ha acabat d'implementar i provar l'API web acabada de crear compilada amb ASP.NET Core.