Esercizio - Implementare le operazioni CRUD

Completato

Si continuerà a estendere il controller dell'API Web per aggiungere la possibilità di creare (POST), aggiornare (PUT) ed eliminare (DELETE) pizze dall'inventario.

Aggiungere una pizza

È ora possibile abilitare l'aggiunta di una pizza tramite l'API Web usando un metodo POST.

Sostituire il commento // POST action in Controllers/PizzaController.cs con il codice seguente:

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

L'azione precedente:

  • Risponde solo al verbo HTTP POST, come indicato dall'attributo [HttpPost].
  • Inserisce l'oggetto Pizza del corpo della richiesta nella cache in memoria.

Nota

Poiché il controller è annotato con l'attributo [ApiController], è implicito che il parametro Pizza verrà trovato nel corpo della richiesta.

Il primo parametro nella chiamata al metodo CreatedAtAction rappresenta un nome di azione. La parola chiave nameof viene usata per evitare di impostare il nome dell'azione come hardcoded. CreatedAtAction usa il nome dell'azione per generare un'intestazione di risposta HTTP location con un URL per la nuova pizza creata, come illustrato nell'unità precedente.

Modificare una pizza

Si può ora abilitare l'aggiornamento di una pizza tramite l'API Web usando un metodo PUT.

Sostituire il commento // PUT action in Controllers/PizzaController.cs con il codice seguente:

[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'azione precedente:

  • Risponde solo al verbo HTTP PUT, come indicato dall'attributo [HttpPut].
  • Richiede che il valore del parametro id sia incluso nel segmento dell'URL dopo pizza/.
  • Restituisce IActionResult perché il tipo restituito ActionResult non è noto fino alla fase di esecuzione. I metodi BadRequest, NotFound e NoContent restituiscono rispettivamente i tipi BadRequestResult, NotFoundResult e NoContentResult.

Nota

Poiché il controller è annotato con l'attributo [ApiController], è implicito che il parametro Pizza verrà trovato nel corpo della richiesta.

Rimuovere una pizza

Abilitare infine la rimozione di una pizza tramite l'API Web usando un metodo DELETE.

Sostituire il commento // DELETE action in Controllers/PizzaController.cs con il codice seguente:

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

L'azione precedente:

  • Risponde solo al verbo HTTP DELETE, come indicato dall'attributo [HttpDelete].
  • Richiede che il valore del parametro id sia incluso nel segmento dell'URL dopo pizza/.
  • Restituisce IActionResult perché il tipo restituito ActionResult non è noto fino alla fase di esecuzione. I metodi NotFound e NoContent restituiscono rispettivamente i tipi NotFoundResult e NoContentResult.
  • Esegue una query nella cache in memoria per trovare una pizza corrispondente al parametro id specificato.

Occorre ricordare di salvare il file Controllers/PizzaController.cs prima di continuare,

Compilare ed eseguire l'API Web finita

Compilare e avviare l'API Web eseguendo il comando seguente:

dotnet run

Testare l'API Web completata con i file .http

  1. Riaprire il file ContosoPizza.http .

  2. Effettuare una richiesta POST per aggiungere una nuova pizza in HttpRepl usando il comando seguente:

    POST {{ContosoPizza_HostAddress}}/pizza/
    Content-Type: application/json
    
    {
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
    ###
    

    Il comando precedente restituisce la pizza appena creata:

    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. Aggiornare la nuova pizza Hawaii a una pizza Hawaiian con una richiesta PUT usando il comando seguente:

    PUT {{ContosoPizza_HostAddress}}/pizza/3
    Content-Type: application/json
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
    ###
    

    Il comando precedente restituisce l'output seguente che indica un'operazione riuscita:

    HTTP/1.1 204 No Content
    Connection: close
    Date: Wed, 17 Jan 2024 17:07:30 GMT
    Server: Kestrel
    

    Per verificare che la pizza sia stata aggiornata, eseguire nuovamente l'azione GET con il comando seguente:

    GET {{ContosoPizza_HostAddress}}/pizza/5
    Accept: application/json
    
    ###
    

    Il comando precedente restituisce la pizza appena aggiornata:

    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. L'API può anche eliminare la pizza appena creata con l'azione DELETE eseguendo il comando seguente:

    DELETE {{ContosoPizza_HostAddress}}/pizza/3
    
    ###
    

    Il comando precedente restituisce un risultato 204 No Content per indicare l'operazione riuscita:

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

    Per verificare che la pizza sia stata rimossa, eseguire nuovamente l'azione GET con il comando seguente:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    

    Il comando precedente restituisce le pizze originali:

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

Sono stati completati l'implementazione e il test della nuova API Web creata con ASP.NET Core.

Facoltativo: testare l'API Web completata con REPL HTTP della riga di comando

  1. Riaprire il terminale httprepl esistente o aprire un nuovo terminale integrato da Visual Studio Code scegliendo Terminale>Nuovo terminale dal menu principale.

  2. Se è stato aperto un nuovo terminale, connettersi all'API Web eseguendo il comando seguente:

    httprepl https://localhost:{PORT}
    

    In alternativa, eseguire questo comando in qualsiasi momento durante l'esecuzione di HttpRepl:

    connect https://localhost:{PORT}
    
  3. Passare all'endpoint Pizza eseguendo questo comando:

    cd Pizza
    
  4. Eseguire il comando seguente per visualizzare le nuove azioni nell'API Pizza:

    ls
    

    Il comando precedente mostra un output di API disponibili per l'endpoint Pizza:

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. Effettuare una richiesta POST per aggiungere una nuova pizza in HttpRepl usando il comando seguente:

    post -c "{"name":"Hawaii", "isGlutenFree":false}"
    

    Il comando precedente restituisce la pizza appena creata:

    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. Aggiornare la nuova pizza Hawaii a una pizza Hawaiian con una richiesta PUT usando il comando seguente:

    put 3 -c  "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
    

    Il comando precedente restituisce l'output seguente che indica un'operazione riuscita:

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

    Per verificare che la pizza sia stata aggiornata, eseguire nuovamente l'azione GET con il comando seguente:

    get 3
    

    Il comando precedente restituisce la pizza appena aggiornata:

    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. L'API può anche eliminare la pizza appena creata con l'azione DELETE eseguendo il comando seguente:

    delete 3
    

    Il comando precedente restituisce un risultato 204 No Content per indicare l'operazione riuscita:

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

    Per verificare che la pizza sia stata rimossa, eseguire nuovamente l'azione GET con il comando seguente:

    get
    

    Il comando precedente restituisce le pizze originali:

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

Sono stati completati l'implementazione e il test della nuova API Web creata con ASP.NET Core.