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

Vamos a habilitar una pizza para agregarla por medio de la API web con un método POST.

  1. 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(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 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

Vamos a habilitar una pizza para actualizarla por medio de la API web con un método PUT.

  1. 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

Vamos a habilitar una pizza para eliminarla por medio de la API web con un método DELETE.

  1. 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 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.

Compilación y ejecución de la API web terminada

  1. Ejecute el siguiente comando para compilar e iniciar la API web:

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

  3. Si ha abierto un nuevo terminal, conéctese a la API web ejecutando el siguiente comando:

    httprepl http://localhost:5000
    

    También puede ejecutar el comando siguiente en cualquier momento mientras se ejecuta HttpRepl:

    Por ejemplo:

    (Disconnected)> connect http://localhost:5000
    

    Vaya al punto de conexión Pizza ejecutando el siguiente comando:

    cd Pizza
    
  4. Ejecute el siguiente comando para ver las nuevas acciones en la API Pizza:

    ls
    

    El comando anterior muestra las API disponibles para el punto de conexión Pizza:

        http://localhost:5000/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 siguiente realiza una solicitud POST para 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
    }
    
  6. Vamos a actualizar la nueva pizza Hawaii a una Hawaiian con una solicitud PUT con 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: Kestrel
    

    Para comprobar que la pizza se ha actualizado, se puede volver a ejecutar la acción GET con el siguiente comando:

    get 3
    

    Esto 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 ejecutando el siguiente comando:

    delete 3
    

    Esto devuelve un valor 204 No Content en caso de hacerse correctamente:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:30:04 GMT
    Server: Kestrel
    

    Para comprobar que la pizza se ha eliminado, se puede volver a ejecutar la acción GET con el siguiente comando:

    get
    

    Esto 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.