Ejercicio: Implementación de operaciones CRUD

Completado

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 de pizza/.
  • Devuelve IActionResult porque no se conoce el tipo de valor devuelto ActionResult hasta el tiempo de ejecución. Los métodos BadRequest, NotFound y NoContent devuelven los tipos BadRequestResult, NotFoundResult y NoContentResult, 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 atributo DELETE.
  • Requiere que se incluya el valor del parámetro id en el segmento de URL después de pizza/.
  • Devuelve IActionResult porque no se conoce el tipo de valor devuelto ActionResult hasta el tiempo de ejecución. Los métodos NotFound y NoContent devuelven los tipos NotFoundResult y NoContentResult, 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

  1. Vuelva a abrir el archivo ContosoPizza.http.

  2. Realice una solicitud POST para agregar una nueva pizza en HttpRepl 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
    }
    
  3. Actualice la nueva pizza Hawaii a una Hawaiian con una solicitud PUT 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
    }
    
  4. 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

  1. Vuelva a abrir el terminal httprepl existente o uno nuevo integrado desde Visual Studio Code seleccionando Terminal>Nuevo terminal en el menú principal.

  2. 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}
    
  3. Ejecute el comando siguiente para ir al punto de conexión Pizza:

    cd Pizza
    
  4. 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]
    
  5. Realice una solicitud POST para agregar una nueva pizza en HttpRepl 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
    }
    
  6. Actualice la nueva pizza Hawaii a una Hawaiian con una solicitud PUT 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
    }
    
  7. 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.