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
Vamos a habilitar una pizza para agregarla por medio de la API web con un método POST.
Reemplace el comentario
// POST actionde Controllers/PizzaController.cs por el código siguiente:[HttpPost] public IActionResult Create(Pizza pizza) { PizzaService.Add(pizza); return CreatedAtAction(nameof(Create), 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ámetroPizzase encontrará en el cuerpo de la solicitud.El primer parámetro de la llamada al método
CreatedAtActionrepresenta un nombre de acción. Se usa la palabra clavenameofpara evitar codificar de forma rígida el nombre de la acción.CreatedAtActionusa el nombre de la acción para generar un encabezado de respuesta HTTPlocationcon una dirección URL a la pizza recién creada, como se ha explicado en la unidad anterior.- Responde solo al verbo HTTP POST, tal y como indica el atributo
Modificación de una pizza
Vamos a habilitar una pizza para actualizarla por medio de la API web con un método PUT.
Reemplace el comentario
// PUT actionde 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
Como el controlador se anota con el atributo
[ApiController], está implícito que el parámetroPizzase encontrará en el cuerpo de la solicitud.- Responde solo al verbo HTTP PUT, tal y como indica el atributo
Eliminación de una pizza
Vamos a habilitar una pizza para eliminarla por medio de la API web con un método DELETE.
Reemplace el comentario
// DELETE actionde 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.
- Responde solo al verbo HTTP DELETE, tal y como indica el atributo
Compilación y ejecución de la API web terminada
Ejecute el siguiente comando para compilar e iniciar la API web:
dotnet runVuelva a abrir el terminal
httpreplexistente o abra 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 http://localhost:5000También puede ejecutar el comando siguiente en cualquier momento mientras se ejecuta HttpRepl:
Por ejemplo:
(Disconnected)> connect http://localhost:5000Vaya al punto de conexión Pizza ejecutando el siguiente comando:
cd PizzaEjecute el siguiente comando para ver las nuevas acciones en la API Pizza:
lsEl comando anterior muestra las API disponibles para el punto de conexión
Pizza:http://localhost:5000/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Realice una solicitud
POSTpara agregar una nueva pizza en HttpRepl usando el comando siguiente:post -c "{"name":"Hawaii", "isGlutenFree":false}"El comando siguiente realiza una solicitud
POSTpara agregar la nueva pizza al inventario y luego devuelve una lista de todas las pizzas:HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:23:09 GMT Location: http://localhost:5000/Pizza?id=3 Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }Vamos a actualizar la nueva pizza
Hawaiia unaHawaiiancon una solicitudPUTcon el siguiente comando:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"Esto devuelve la siguiente salida que se ha ejecutado 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, se puede volver a ejecutar la acción
GETcon el siguiente comando:get 3Esto 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
DELETEejecutando el siguiente comando:delete 3Esto devuelve un valor
204 No Contenten caso de hacerse correctamente:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPara comprobar que la pizza se ha eliminado, se puede volver a ejecutar la acción
GETcon el siguiente comando:getEsto 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 } ]
Ya se ha terminado de implementar y probar la API web recién creada compilada con ASP.NET Core. A continuación se van a proporcionar algunos procedimientos recomendados y otros módulos de aprendizaje.
¿Necesita ayuda? Consulte nuestra guía de solución de problemas o notifique un problema para enviar comentarios específicos.