Exercice - Implémenter les opérations CRUD
Nous allons continuer à étendre notre contrôleur d’API web en ajoutant la possibilité de créer (POST), de mettre à jour (PUT) et de supprimer (DELETE) une pizza dans notre inventaire.
Ajouter une pizza
Nous allons permettre l’ajout d’une pizza par le biais de l’API web à l’aide d’une méthode POST.
Remplacez le commentaire // POST action dans Controllers/PizzaController.cs par le code suivant :
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
L’action précédente :
- Répond uniquement au verbe HTTP
POST, comme indiqué par l’attribut[HttpPost]. - Insère l’objet
Pizzadu corps de la requête dans le cache en mémoire.
Notes
Étant donné que le contrôleur est annoté avec l’attribut [ApiController],le fait que le paramètre Pizza se trouve dans le corps de la requête est implicite.
Le premier paramètre de l’appel de méthode CreatedAtAction représente un nom d’action. Le mot clé nameof est utilisé pour éviter de coder en dur le nom d’action.
CreatedAtAction utilise le nom de l’action pour générer un en-tête de réponse HTTP location avec une URL vers la pizza nouvellement créée, comme expliqué dans l’unité précédente.
Modifier une pizza
Désormais, nous allons permettre la mise à jour d’une pizza par le biais de l’API web à l’aide d’une méthode PUT.
Remplacez le commentaire // PUT action dans Controllers/PizzaController.cs par le code suivant :
[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’action précédente :
- Répond uniquement au verbe HTTP PUT, comme indiqué par l’attribut
[HttpPut]. - Exige que la valeur du paramètre
idsoit incluse dans le segment d’URL aprèspizza/. - Retourne
IActionResult, car le type de retour deActionResultn’est pas connu avant l’exécution. Les méthodesBadRequest,NotFoundetNoContentretournent les typesBadRequestResult,NotFoundResultetNoContentResult, respectivement.
Notes
Étant donné que le contrôleur est annoté avec l’attribut [ApiController],le fait que le paramètre Pizza se trouve dans le corps de la requête est implicite.
Supprimer une pizza
Enfin, nous allons permettre la suppression d’une pizza par le biais de l’API web à l’aide d’une méthode DELETE.
Remplacez le commentaire // DELETE action dans Controllers/PizzaController.cs par le code suivant :
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
L’action précédente :
- Répond uniquement au verbe HTTP
DELETE, comme indiqué par l’attribut[HttpDelete]. - Exige que la valeur du paramètre
idsoit incluse dans le segment d’URL aprèspizza/. - Retourne
IActionResult, car le type de retourActionResultn’est pas connu avant l’exécution. Les méthodesNotFoundetNoContentretournent respectivement les typesNotFoundResultetNoContentResult. - Interroge le cache en mémoire pour une pizza correspondant au paramètre
idfourni.
N’oubliez pas d’enregistrer le fichier Contrôleurs/PizzaController.cs avant de continuer,
Générer et exécuter l’API web terminée
Générez et démarrez l’API web en exécutant la commande suivante :
dotnet run
Tester l’API web terminée avec des fichiers HTTP
Rouvrez le fichier ContosoPizza.http .
Effectuez une requête
POSTpour ajouter une nouvelle pizza dansHttpReplen utilisant la commande suivante :POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###La commande précédente retourne la pizza qui vient d’être créée :
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 }Mettez à jour la nouvelle pizza
Hawaiien pizzaHawaiianavec une requêtePUTen utilisant la commande suivante :PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###La commande précédente renvoie la sortie suivante qui indique une réussite :
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: KestrelPour vérifier que la pizza a été mise à jour, réexécutez l’action
GETavec la commande suivante :GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###La commande précédente retourne la pizza qui vient d’être mise à jour :
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 }Notre API peut également supprimer la pizza nouvellement créée avec l’action
DELETEen exécutant la commande suivante :DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###La commande précédente renvoie un résultat
204 No Contentpour une réussite :HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPour vérifier que la pizza a été supprimée, réexécutez l’action
GETavec la commande suivante :GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###La commande précédente retourne les pizzas d’origine en tant que résultats :
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 } ]
Vous avez maintenant terminé l’implémentation et le test de l’API web nouvellement créée générée avec ASP.NET Core.
Facultatif : Tester l’API web terminée avec la ligne de commande HTTPREPL
Rouvrez le terminal existant
httpreplou ouvrez un nouveau terminal intégré à partir de Visual Studio Code en sélectionnant Terminal> dans le menu principal.Si vous avez ouvert un nouveau terminal, connectez-vous à l’API web en exécutant la commande suivante :
httprepl https://localhost:{PORT}Vous pouvez aussi exécuter la commande suivante à tout moment pendant l’exécution de
HttpRepl:connect https://localhost:{PORT}Accédez au point de terminaison
Pizzaen exécutant la commande suivante :cd PizzaExécutez la commande suivante pour voir les nouvelles actions sur l’API Pizza :
lsLa commande précédente affiche une sortie des API disponibles pour le point de terminaison
Pizza:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Effectuez une requête
POSTpour ajouter une nouvelle pizza dansHttpReplen utilisant la commande suivante :post -c "{"name":"Hawaii", "isGlutenFree":false}"La commande précédente retourne la pizza qui vient d’être créée :
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 }Mettez à jour la nouvelle pizza
Hawaiien pizzaHawaiianavec une requêtePUTen utilisant la commande suivante :put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"La commande précédente renvoie la sortie suivante qui indique une réussite :
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: KestrelPour vérifier que la pizza a été mise à jour, réexécutez l’action
GETavec la commande suivante :get 3La commande précédente retourne la pizza qui vient d’être mise à jour :
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 }Notre API peut également supprimer la pizza nouvellement créée avec l’action
DELETEen exécutant la commande suivante :delete 3La commande précédente renvoie un résultat
204 No Contentpour une réussite :HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPour vérifier que la pizza a été supprimée, réexécutez l’action
GETavec la commande suivante :getLa commande précédente retourne les pizzas d’origine en tant que résultats :
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 } ]
Vous avez maintenant terminé l’implémentation et le test de l’API web nouvellement créée générée avec ASP.NET Core.