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
Pizzadel 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
iden el segmento de URL después depizza/. - Devuelve
IActionResultporque no se conoce el tipo de valor devueltoActionResulthasta el tiempo de ejecución. Los métodosBadRequest,NotFoundyNoContentdevuelven los tiposBadRequestResult,NotFoundResultyNoContentResult, respectivamente.
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.
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
DELETE, tal y como indica el atributo[HttpDelete]. - Requiere que se incluya el valor del parámetro
iden el segmento de URL después depizza/. - Devuelve
IActionResultporque no se conoce el tipo de valor devueltoActionResulthasta el tiempo de ejecución. Los métodosNotFoundyNoContentdevuelven los tiposNotFoundResultyNoContentResult, respectivamente. - Consulta la caché en memoria en busca de una pizza que coincida con el parámetro
idproporcionado.
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
POSTpara agregar una nueva pizza enHttpReplusando 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
Hawaiia unaHawaiiancon una solicitudPUTcon 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: KestrelPara comprobar que la pizza se ha actualizado, vuelva a ejecutar la acción
GETcon 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
DELETEsi ejecuta el siguiente comando:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###El comando anterior devuelve un resultado
204 No Contentsi es correcto:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPara comprobar que la pizza se ha quitado, vuelva a ejecutar la acción
GETcon 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 existente
httpreplo abra un nuevo terminal 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
HttpReplse ejecuta:connect https://localhost:{PORT}Ejecute el comando siguiente para ir al punto de conexión
Pizza:cd PizzaEjecute el siguiente comando para ver las nuevas acciones en la API Pizza:
lsEl 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
POSTpara agregar una nueva pizza enHttpReplusando 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
Hawaiia unaHawaiiancon una solicitudPUTcon 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: KestrelPara comprobar que la pizza se ha actualizado, vuelva a ejecutar la acción
GETcon el siguiente comando:get 3El 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
DELETEsi ejecuta el siguiente comando:delete 3El comando anterior devuelve un resultado
204 No Contentsi es correcto:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPara comprobar que la pizza se ha quitado, vuelva a ejecutar la acción
GETcon el siguiente comando:getEl 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.