Exercice : Ajouter un contrôleur

Effectué

Un contrôleur est une classe publique avec une ou plusieurs méthodes publiques appelées actions. Par convention, un contrôleur est placé dans le répertoire Controllers de la racine du projet. Les actions sont exposées en tant que points de terminaison HTTP à l’intérieur du contrôleur de l’API web.

Création d’un contrôleur

  1. Sélectionnez le dossier Controllers dans Visual Studio Code et ajoutez un nouveau fichier appelé PizzaController.cs.

    Screenshot of Visual Studio Code that shows adding a new file to the Controllers folder.

    Un fichier de classe vide nommé PizzaController.cs est créé dans le répertoire Controllers. Le nom du répertoire des Contrôleurs est une convention. Il provient de l’architecture model-view-controller (Modèle-Vue-Contrôleur) utilisée par l’API web.

    Notes

    Par convention, les noms de classe de contrôleur ont le suffixe Controller.

  2. Ajoutez le code suivant à Controllers/PizzaController.cs. Enregistrez vos modifications.

    using ContosoPizza.Models;
    using ContosoPizza.Services;
    using Microsoft.AspNetCore.Mvc;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class PizzaController : ControllerBase
    {
        public PizzaController()
        {
        }
    
        // GET all action
    
        // GET by Id action
    
        // POST action
    
        // PUT action
    
        // DELETE action
    }
    

    Comme vous l’avez découvert précédemment, cette classe dérive de ControllerBase, la classe de base pour l’utilisation des requêtes HTTP ASP.NET Core. Il comprend également les deux attributs standard que vous avez découverts : [ApiController] et [Route]. Comme précédemment, l’attribut [Route] définit un mappage au jeton [controller]. Étant donné que cette classe de contrôleur est nommée PizzaController, ce contrôleur gère les requêtes à https://localhost:{PORT}/pizza.

Récupérer toutes les pizzas

Le premier verbe REST que vous devez implémenter est GET, qui permet à un client d’obtenir toutes les pizzas de l’API. Vous pouvez utiliser l’attribut intégré [HttpGet] pour définir une méthode qui retourne les pizzas depuis notre service.

Remplacez le commentaire // GET all action dans Controllers/PizzaController.cs par le code suivant :

[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

L’action précédente :

  • Répond uniquement au verbe HTTP GET, comme indiqué par l’attribut [HttpGet].
  • Retourne une instance ActionResult de type List<Pizza>. Le type ActionResult est la classe de base pour tous les résultats d’action dans ASP.NET Core.
  • Interroge le service pour toutes les pizzas et retourne automatiquement les données avec une valeur Content-Type de application/json.

Récupérer une seule pizza

Le client peut également demander à obtenir des informations sur une pizza spécifique, au lieu de la liste entière. Vous pouvez implémenter une autre action GET qui demande un paramètre id. Vous pouvez utiliser l’attribut intégré [HttpGet("{id}")] pour définir une méthode qui retourne les pizzas depuis notre service. La logique de routage inscrit [HttpGet] (sans id) et [HttpGet("{id}")] (avec id) comme deux itinéraires différents. Vous pouvez ensuite écrire une action distincte pour récupérer un seul élément.

Remplacez le commentaire // GET by Id action dans Controllers/PizzaController.cs par le code suivant :

[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

L’action précédente :

  • Répond uniquement au verbe HTTP GET, comme indiqué par l’attribut [HttpGet].
  • Exige que la valeur du paramètre id soit incluse dans le segment d’URL après pizza/. Rappelez-vous que le modèle [Route] a été défini par l’attribut /pizza au niveau du contrôleur.
  • Interroge la base de données pour une pizza correspondant au paramètre id fourni.

Chaque ActionResult utilisé dans l’action précédente est mappé au code d’état HTTP correspondant du tableau suivant :

ASP.NET Core
Résultat de l’action
Code d’état HTTP Description
Ok est implicite 200 Un produit correspondant au paramètre id fourni existe dans le cache en mémoire.
Le produit est inclus dans le corps de la réponse dans le type de média, comme défini dans l’en-tête de la requête HTTP accept (JSON par défaut).
NotFound 404 Un produit correspondant au paramètre id fourni n’existe pas dans le cache en mémoire.

Générer et exécuter le nouveau contrôleur

Générez et démarrez l’API web en exécutant la commande suivante :

dotnet run

Tester le contrôleur avec le fichier .http

  1. Ouvrir ContosoPizza.http

  2. Ajoutez un nouveau GET pour appeler le point de terminaison Pizza sous le séparateur ### :

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. Sélectionnez la commande Envoyer la demande au-dessus de ce nouvel appel GET.

    La commande précédente renvoie une liste de toutes les pizzas au format JSON :

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 16:57:09 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]   
    
  4. Pour faire une requête sur une seule pizza, vous pouvez faire une autre requête GET, mais passer un paramètre id en utilisant la commande suivante :

    GET {{ContosoPizza_HostAddress}}/pizza/1
    Accept: application/json
    
    ###
    

    La commande précédente retourne Classic Italian avec la sortie suivante :

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  5. Notre API gère également les situations où l’élément n’existe pas. Appelons à nouveau l’API, mais passons un paramètre id de pizza non valide avec la commande suivante :

    GET {{ContosoPizza_HostAddress}}/pizza/5
    Accept: application/json
    
    ###
    

    La commande précédente retourne une erreur 404 Not Found avec la sortie suivante :

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    

Vous avez maintenant terminé l’implémentation des verbes GET. Dans l’unité suivante, vous pouvez ajouter des actions à PizzaController pour prendre en charge les opérations CRUD sur les données de pizza.

Facultatif : Tester le contrôleur avec la ligne de commande HTTP REPL

  1. Ouvrez 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. Connectez-vous à notre 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. Pour voir le point de terminaison Pizza nouvellement disponible, exécutez la commande suivante :

    ls
    

    La commande précédente détecte toutes les API disponibles sur le point de terminaison connecté. Le code suivant doit s’afficher :

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. Accédez au point de terminaison Pizza en exécutant la commande suivante :

    cd Pizza
    

    La commande précédente affiche une sortie des API disponibles pour le point de terminaison Pizza :

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. Effectuez une requête GET dans HttpRepl en utilisant la commande suivante :

    get
    

    La commande précédente renvoie une liste de toutes les pizzas au format JSON :

      HTTP/1.1 200 OK
      Content-Type: application/json; charset=utf-8
      Date: Fri, 02 Apr 2021 21:55:53 GMT
      Server: Kestrel
      Transfer-Encoding: chunked
    
      [
          {
              "id": 1,
              "name": "Classic Italian",
              "isGlutenFree": false
          },
          {
              "id": 2,
              "name": "Veggie",
              "isGlutenFree": true
          }
      ]
    
  6. Pour faire une requête sur une seule pizza, vous pouvez faire une autre requête GET, mais passer un paramètre id en utilisant la commande suivante :

    get 1
    

    La commande précédente retourne Classic Italian avec la sortie suivante :

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  7. Notre API gère également les situations où l’élément n’existe pas. Appelons à nouveau l’API, mais passons un paramètre id de pizza non valide avec la commande suivante :

    get 5
    

    La commande précédente retourne une erreur 404 Not Found avec la sortie suivante :

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    
  8. Revenez au terminal dotnet dans la liste déroulante de Visual Studio Code et arrêtez l’API web en sélectionnant sur CTRL+C sur votre clavier.

Vous avez maintenant terminé l’implémentation des verbes GET. Dans l’unité suivante, vous pouvez ajouter des actions à PizzaController pour prendre en charge les opérations CRUD sur les données de pizza.