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
Pizza
du 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
id
soit incluse dans le segment d’URL aprèspizza/
. - Retourne
IActionResult
, car le type de retour deActionResult
n’est pas connu avant l’exécution. Les méthodesBadRequest
,NotFound
etNoContent
retournent les typesBadRequestResult
,NotFoundResult
etNoContentResult
, 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
id
soit incluse dans le segment d’URL aprèspizza/
. - Retourne
IActionResult
, car le type de retourActionResult
n’est pas connu avant l’exécution. Les méthodesNotFound
etNoContent
retournent respectivement les typesNotFoundResult
etNoContentResult
. - Interroge le cache en mémoire pour une pizza correspondant au paramètre
id
fourni.
N’oubliez pas d’enregistrer le fichier Controllers/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
POST
pour ajouter une nouvelle pizza dansHttpRepl
en 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
Hawaii
en pizzaHawaiian
avec une requêtePUT
en 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: Kestrel
Pour vérifier que la pizza a été mise à jour, réexécutez l’action
GET
avec 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
DELETE
en exécutant la commande suivante :DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###
La commande précédente renvoie un résultat
204 No Content
pour une réussite :HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Pour vérifier que la pizza a été supprimée, réexécutez l’action
GET
avec 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
httprepl
existant ou un nouveau terminal intégré depuis Visual Studio Code en sélectionnant Terminal>Nouveau 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
Pizza
en exécutant la commande suivante :cd Pizza
Exécutez la commande suivante pour voir les nouvelles actions sur l’API Pizza :
ls
La 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
POST
pour ajouter une nouvelle pizza dansHttpRepl
en 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
Hawaii
en pizzaHawaiian
avec une requêtePUT
en 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: Kestrel
Pour vérifier que la pizza a été mise à jour, réexécutez l’action
GET
avec la commande suivante :get 3
La 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
DELETE
en exécutant la commande suivante :delete 3
La commande précédente renvoie un résultat
204 No Content
pour une réussite :HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Pour vérifier que la pizza a été supprimée, réexécutez l’action
GET
avec la commande suivante :get
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.