Exercice : Ajouter un contrôleur
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
Sélectionnez le dossier Controllers dans Visual Studio Code et ajoutez un nouveau fichier appelé PizzaController.cs.
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.
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éePizzaController
, 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 typeList<Pizza>
. Le typeActionResult
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
deapplication/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èspizza/
. 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 un fichier Http
Ouvrir ContosoPizza.http
Ajoutez un nouveau GET pour appeler le point de terminaison
Pizza
sous le séparateur ### :GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
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 } ]
Pour faire une requête sur une seule pizza, vous pouvez faire une autre requête
GET
, mais passer un paramètreid
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 }
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" }
Maintenant que 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 Read-Eval-Print Loop (REPL)
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.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}
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]
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]
Effectuez une requête
GET
dansHttpRepl
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 } ]
Pour faire une requête sur une seule pizza, vous pouvez faire une autre requête
GET
, mais passer un paramètreid
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 }
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" }
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.
Maintenant que 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.