Exercice - Implémenter les opérations CRUD

Effectué

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ès pizza/.
  • Retourne IActionResult, car le type de retour de ActionResult n’est pas connu avant l’exécution. Les méthodes BadRequest, NotFound et NoContent retournent les types BadRequestResult, NotFoundResult et NoContentResult, 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ès pizza/.
  • Retourne IActionResult, car le type de retour ActionResult n’est pas connu avant l’exécution. Les méthodes NotFound et NoContent retournent respectivement les types NotFoundResult et NoContentResult.
  • 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

  1. Rouvrez le fichier ContosoPizza.http.

  2. Effectuez une requête POST pour ajouter une nouvelle pizza dans HttpRepl 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
    }
    
  3. Mettez à jour la nouvelle pizza Hawaii en pizza Hawaiian avec une requête PUT 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
    }
    
  4. 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

  1. 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.

  2. 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}
    
  3. Accédez au point de terminaison Pizza en exécutant la commande suivante :

    cd Pizza
    
  4. 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]
    
  5. Effectuez une requête POST pour ajouter une nouvelle pizza dans HttpRepl 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
    }
    
  6. Mettez à jour la nouvelle pizza Hawaii en pizza Hawaiian avec une requête PUT 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
    }
    
  7. 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.