Ejercicio: Implementación de operaciones CRUD
Vamos a seguir ampliando el controlador de API web para agregar la capacidad de crear (POST
), actualizar (PUT
) y eliminar (DELETE
) pizzas en el inventario.
Incorporación de una pizza
Habilitemos una pizza para agregarla a través de la API web mediante un método POST
.
Reemplace el comentario // POST action
de Controllers/PizzaController.cs por el código siguiente:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
La acción anterior:
- Responde solo al verbo HTTP
POST
, tal y como indica el atributo[HttpPost]
. - Inserta el objeto
Pizza
del cuerpo de la solicitud en la caché en memoria.
Nota
Dado que el controlador se anota con el atributo [ApiController]
, está implícito que el parámetro Pizza
se encontrará en el cuerpo de la solicitud.
El primer parámetro de la llamada al método CreatedAtAction
representa un nombre de acción. Se usa la palabra clave nameof
para evitar codificar de forma rígida el nombre de la acción. CreatedAtAction
usa el nombre de la acción para generar un encabezado de respuesta HTTP location
con una dirección URL a la pizza recién creada, como se ha explicado en la unidad anterior.
Modificación de una pizza
Ahora, habilitemos una pizza para actualizarla a través de la API web mediante un método PUT
.
Reemplace el comentario // PUT action
de Controllers/PizzaController.cs por el código siguiente:
[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();
}
La acción anterior:
- Responde solo al verbo HTTP PUT, tal y como indica el atributo
[HttpPut]
. - Requiere que se incluya el valor del parámetro
id
en el segmento de URL después depizza/
. - Devuelve
IActionResult
porque no se conoce el tipo de valor devueltoActionResult
hasta el tiempo de ejecución. Los métodosBadRequest
,NotFound
yNoContent
devuelven los tiposBadRequestResult
,NotFoundResult
yNoContentResult
, respectivamente.
Nota
Como el controlador se anota con el atributo [ApiController]
, está implícito que el parámetro Pizza
se encontrará en el cuerpo de la solicitud.
Eliminación de una pizza
Por último, habilitemos una pizza para quitarla a través de la API web mediante un método DELETE
.
Reemplace el comentario // DELETE action
de Controllers/PizzaController.cs por el código siguiente:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
La acción anterior:
- Responde solo al verbo HTTP
[HttpDelete]
, tal y como indica el atributoDELETE
. - Requiere que se incluya el valor del parámetro
id
en el segmento de URL después depizza/
. - Devuelve
IActionResult
porque no se conoce el tipo de valor devueltoActionResult
hasta el tiempo de ejecución. Los métodosNotFound
yNoContent
devuelven los tiposNotFoundResult
yNoContentResult
, respectivamente. - Consulta la caché en memoria en busca de una pizza que coincida con el parámetro
id
proporcionado.
No olvide guardar el archivo Controllers/PizzaController.cs antes de continuar.
Compilación y ejecución de la API web terminada
Ejecute el siguiente comando para compilar e iniciar la API web:
dotnet run
Prueba de la API web finalizada con archivos HTTP
Vuelva a abrir el archivo ContosoPizza.http.
Realice una solicitud
POST
para agregar una nueva pizza enHttpRepl
usando el comando siguiente:POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###
El comando anterior devuelve la pizza recién creada:
HTTP/1.1 201 Created Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 17:03:02 GMT Server: Kestrel Location: http://localhost:5192/Pizza/3 Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }
Actualice la nueva pizza
Hawaii
a unaHawaiian
con una solicitudPUT
con el siguiente comando:PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###
El comando anterior devuelve la siguiente salida que indica que se ha hecho correctamente:
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: Kestrel
Para comprobar que la pizza se ha actualizado, vuelva a ejecutar la acción
GET
con el siguiente comando:GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###
El comando anterior devuelve la pizza recién actualizada:
HTTP/1.1 200 OK Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 17:09:01 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaiian", "isGlutenFree": false }
La API también puede eliminar la pizza recién creada con la acción
DELETE
si ejecuta el siguiente comando:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###
El comando anterior devuelve un resultado
204 No Content
si es correcto:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Para comprobar que la pizza se ha quitado, vuelva a ejecutar la acción
GET
con el siguiente comando:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
El comando anterior devuelve las pizzas originales como resultados:
HTTP/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 } ]
Ahora ha terminado de implementar y probar una API web recién creada con ASP.NET Core.
Opcional: Prueba de la API web finalizada con HTTPREPL de la línea de comandos
Vuelva a abrir el terminal
httprepl
existente o uno nuevo integrado desde Visual Studio Code seleccionando Terminal>Nuevo terminal en el menú principal.Si ha abierto un nuevo terminal, conéctese a la API web ejecutando el siguiente comando:
httprepl https://localhost:{PORT}
Como alternativa, ejecute el siguiente comando en cualquier momento mientras
HttpRepl
se ejecuta:connect https://localhost:{PORT}
Ejecute el comando siguiente para ir al punto de conexión
Pizza
:cd Pizza
Ejecute el siguiente comando para ver las nuevas acciones en la API Pizza:
ls
El comando anterior muestra una salida de las API disponibles para el punto de conexión
Pizza
:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]
Realice una solicitud
POST
para agregar una nueva pizza enHttpRepl
usando el comando siguiente:post -c "{"name":"Hawaii", "isGlutenFree":false}"
El comando anterior devuelve la pizza recién creada:
HTTP/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 }
Actualice la nueva pizza
Hawaii
a unaHawaiian
con una solicitudPUT
con el siguiente comando:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
El comando anterior devuelve la siguiente salida que indica que se ha hecho correctamente:
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: Kestrel
Para comprobar que la pizza se ha actualizado, vuelva a ejecutar la acción
GET
con el siguiente comando:get 3
El comando anterior devuelve la pizza recién actualizada:
HTTP/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 }
La API también puede eliminar la pizza recién creada con la acción
DELETE
si ejecuta el siguiente comando:delete 3
El comando anterior devuelve un resultado
204 No Content
si es correcto:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Para comprobar que la pizza se ha quitado, vuelva a ejecutar la acción
GET
con el siguiente comando:get
El comando anterior devuelve las pizzas originales como resultados:
HTTP/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 } ]
Ahora ha terminado de implementar y probar una API web recién creada con ASP.NET Core.