Exercici: Implementació d'operacions CRUD

Seguirem ampliant el controlador d'API web per afegir la capacitat de crear ( POST), actualitzar ( PUT) i eliminar ( DELETE) pizzes a l'inventari.

Incorporació d´una pizza

Habilitem una pizza per afegir-la a través de l'API web mitjançant un mètode POST.

Reemplaceu el comentari // POST actionde Controllers/PizzaController.cs pel codi següent:

C#
[HttpPost]
public IActionResult Create(Pizza pizza)
{            
    PizzaService.Add(pizza);
    return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}

L'acció anterior:

  • Respon només al verb HTTP POST, tal com indica l'atribut [HttpPost].
  • Insereix l'objecte Pizzadel cos de la sol·licitud a la memòria cau en memòria.

Nota

Atès que el controlador s'anota amb l'atribut [ApiController], està implícit que el paràmetre Pizzaes trobarà al cos de la sol·licitud.

El primer paràmetre de la trucada al mètode CreatedAtActionrepresenta un nom dacció. Es fa servir la paraula clau nameofper evitar codificar de manera rígida el nom de l'acció. CreatedAtActionutilitza el nom de l'acció per generar una capçalera de resposta HTTP locationamb una adreça URL a la pizza acabada de crear, com s'ha explicat a la unitat anterior.

Modificació d´una pizza

Ara habilitem una pizza per actualitzar-la a través de l'API web mitjançant un mètode PUT.

Reemplaceu el comentari // PUT actionde Controllers/PizzaController.cs pel codi següent:

C#
[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();
}

L'acció anterior:

  • Només respon al verb HTTP PUT, tal com indica l'atribut [HttpPut].
  • Cal que s'inclogui el valor del paràmetre idal segment d'URL després de pizza/.
  • Torna IActionResultperquè no es coneix el tipus de valor tornat ActionResultfins al temps d'execució. Els mètodes BadRequest, NotFoundi NoContentretornen els tipus BadRequestResult, NotFoundResulti NoContentResult, respectivament.

Nota

Com que el controlador s'anota amb l'atribut [ApiController], està implícit que el paràmetre Pizzaes trobarà al cos de la sol·licitud.

Eliminació d´una pizza

Finalment, habilitem una pizza per treure-la a través de l'API web mitjançant un mètode DELETE.

Reemplaceu el comentari // DELETE actionde Controllers/PizzaController.cs pel codi següent:

C#
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
    var pizza = PizzaService.Get(id);
   
    if (pizza is null)
        return NotFound();
       
    PizzaService.Delete(id);
   
    return NoContent();
}

L'acció anterior:

  • Respon només al verb HTTP [HttpDelete], tal com indica l'atribut DELETE.
  • Cal que s'inclogui el valor del paràmetre idal segment d'URL després de pizza/.
  • Torna IActionResultperquè no es coneix el tipus de valor tornat ActionResultfins al temps d'execució. Els mètodes NotFoundi NoContentretornen els tipus NotFoundResulti NoContentResult, respectivament.
  • Consulta la memòria cau en memòria a la recerca d'una pizza que coincideixi amb el paràmetre idproporcionat.

No oblideu desar el fitxer Controllers/PizzaController.cs abans de continuar.

Compilació i execució de l'API web acabada

  1. Executeu l'ordre següent per compilar i iniciar l'API web:

    CLI de .NET
    dotnet run
    
  2. Torneu a obrir el terminal httpreplexistent o un de nou integrat des del Visual Studio Code seleccionant Terminal > Nou terminal al menú principal.

  3. Si heu obert un nou terminal, connecteu-vos a l'API web executant la següent ordre:

    CLI de .NET
    httprepl https://localhost:{PORT}
    

    Com a alternativa, executeu la següent ordre en qualsevol moment mentre HttpRepls'executa:

    CLI de .NET
    connect https://localhost:{PORT}
    
  4. Executeu l'ordre següent per anar al punt de connexió Pizza:

    CLI de .NET
    cd Pizza
    
  5. Executeu l'ordre següent per veure les noves accions a l'API Pizza:

    CLI de .NET
    ls
    

    L'ordre anterior mostra una sortida de les API disponibles per al punt de connexió Pizza:

    Resultats
        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  6. Feu una sol·licitud POSTper afegir una pizza nova fent servir HttpRepll'ordre següent:

    CLI de .NET
    post -c "{"name":"Hawaii", "isGlutenFree":false}"
    

    L'ordre anterior torna una llista de totes les pizzes:

    Resultats
    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
    }
    
  7. Actualitzeu la nova pizza Hawaiia una Hawaiianamb una sol·licitud PUTamb la següent ordre:

    CLI de .NET
    put 3 -c  "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
    

    L'ordre anterior torna la sortida següent que indica que s'ha fet correctament:

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

    Per comprovar que la pizza s'ha actualitzat, torneu a executar l'acció GETamb la següent ordre:

    CLI de .NET
    get 3
    

    La comanda anterior torna la pizza recent actualitzada:

    Resultats
    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
    }
    
  8. L'API també pot eliminar la pizza acabada de crear amb l'acció DELETEsi executeu l'ordre següent:

    CLI de .NET
    delete 3
    

    La comanda anterior torna un resultat 204 No Contentsi és correcte:

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

    Per comprovar que la pizza s'ha tret, torneu a executar l'acció GETamb la següent ordre:

    CLI de .NET
    get
    

    La comanda anterior torna les pizzes originals com a resultats:

    Resultats
    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
        }
    ]
    

Ja s'ha acabat d'implementar i provar l'API web acabada de crear compilada amb ASP.NET Core.


Mòdul completat:

Següent