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
Pizzadel 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
idsia incluso nel segmento dell'URL dopopizza/. - Restituisce
IActionResultperché il tipo restituitoActionResultnon è noto fino alla fase di esecuzione. I metodiBadRequest,NotFoundeNoContentrestituiscono rispettivamente i tipiBadRequestResult,NotFoundResulteNoContentResult.
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
idsia incluso nel segmento dell'URL dopopizza/. - Restituisce
IActionResultperché il tipo restituitoActionResultnon è noto fino alla fase di esecuzione. I metodiNotFoundeNoContentrestituiscono rispettivamente i tipiNotFoundResulteNoContentResult. - Esegue una query nella cache in memoria per trovare una pizza corrispondente al parametro
idspecificato.
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
POSTper aggiungere una nuova pizza inHttpReplusando 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
Hawaiia una pizzaHawaiiancon una richiestaPUTusando 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: KestrelPer verificare che la pizza sia stata aggiornata, eseguire nuovamente l'azione
GETcon 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
DELETEeseguendo il comando seguente:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###Il comando precedente restituisce un risultato
204 No Contentper indicare l'operazione riuscita:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPer verificare che la pizza sia stata rimossa, eseguire nuovamente l'azione
GETcon 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
httpreplesistente 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
Pizzaeseguendo questo comando:cd PizzaEseguire il comando seguente per visualizzare le nuove azioni nell'API Pizza:
lsIl 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
POSTper aggiungere una nuova pizza inHttpReplusando 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
Hawaiia una pizzaHawaiiancon una richiestaPUTusando 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: KestrelPer verificare che la pizza sia stata aggiornata, eseguire nuovamente l'azione
GETcon il comando seguente:get 3Il 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
DELETEeseguendo il comando seguente:delete 3Il comando precedente restituisce un risultato
204 No Contentper indicare l'operazione riuscita:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPer verificare che la pizza sia stata rimossa, eseguire nuovamente l'azione
GETcon il comando seguente:getIl 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.