Esercizio - Implementare le operazioni CRUD
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 dopopizza/
. - Restituisce
IActionResult
perché il tipo restituitoActionResult
non è noto fino alla fase di esecuzione. I metodiBadRequest
,NotFound
eNoContent
restituiscono rispettivamente i tipiBadRequestResult
,NotFoundResult
eNoContentResult
.
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 dopopizza/
. - Restituisce
IActionResult
perché il tipo restituitoActionResult
non è noto fino alla fase di esecuzione. I metodiNotFound
eNoContent
restituiscono rispettivamente i tipiNotFoundResult
eNoContentResult
. - 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
Riaprire il file ContosoPizza.http.
Effettuare una richiesta
POST
per aggiungere una nuova pizza inHttpRepl
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 }
Aggiornare la nuova pizza
Hawaii
a una pizzaHawaiian
con una richiestaPUT
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/3 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 }
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 la riga di comando HTTPREPL
Riaprire il terminale
httprepl
esistente o aprire un nuovo terminale integrato da Visual Studio Code scegliendo Terminale>Nuovo terminale dal menu principale.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}
Passare all'endpoint
Pizza
eseguendo questo comando:cd Pizza
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]
Effettuare una richiesta
POST
per aggiungere una nuova pizza inHttpRepl
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 }
Aggiornare la nuova pizza
Hawaii
a una pizzaHawaiian
con una richiestaPUT
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 }
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.