<style> .reveal { font-size: 27px; } mark { background-color: rgba(50, 168, 82, .5) !important; } </style> # I-CH 151 Intégrer des bases de données dans des applications Web 1&#46; ASP.NET Core Routing © Selmir Hajruli & EPSIC 2021 --- ![](https://i.imgur.com/DfVhZwP.jpg) --- # Fonctionnement ![](https://i.imgur.com/86PQ6qe.png) --- # Parsing de la requête ![](https://i.imgur.com/7qzGs3X.png) --- # Types de routing - Convention based Dans le routing par convention, la "route" est déterminée sur la base des conventions qui feront correspondre les demandes entrantes (c'est-à-dire les URL) avec les contrôleurs et leurs méthodes. - Attribute based Dans le routage basé sur les attributs, l'itinéraire est déterminé en fonction des attributs qui sont configurés soit au niveau du contrôleur, soit au niveau de la méthode d'action. Nous pouvons utiliser à la fois le routage conventionnel et le routage par attributs dans une seule application. --- # Convention based `[Route("[controller]/[action]")]` ```csharp=12 [ApiController] [Route("[controller]/[action]")] public class CharactersController : ControllerBase { [HttpGet] public IActionResult Get() {} } ``` :::info /Characters/ ::: ```csharp=12 [ApiController] [Route("[controller]/[action]")] public class GamesController : ControllerBase { [HttpGet] public IActionResult Players() {} } ``` :::info /Games/Players ::: --- # Query string Partie de l'URL qui permet de passer une liste paramètres au serveur. ```csharp=12 [ApiController] [Route("[controller]/[action]")] public class GamesController : ControllerBase { [HttpGet] public IActionResult Players(string nom, string prenom) {} } ``` :::info /Games/Players?==nom=doe==&==prenom=john== ::: --- # Attribute based `[HttpGet("personnages/tous")]` ```csharp [ApiController] public class CharactersController : ControllerBase { [HttpGet("personnages/tous")] public IActionResult GetAll() { var persos = new List<Character>(); persos.Add(new Character { Name = "Epsic" }); persos.Add(new Character { Name = "Info3e" }); return Ok(persos); } } ``` :::info /personnages/tous ::: --- # Route parameter Partie de l'URL qui permet de passer une clé unique au serveur. https://localhost:5000/characters/==9283== ```csharp [ApiController] public class CharactersController : ControllerBase { [HttpGet("personnages/{id}")] public IActionResult GetAll(int id) { return Ok(persos.Where(a => a.Id == id)); } } ``` :::info /personnages/9283 ::: --- # Exercice #1 :::info - git clone https://github.com/Selmirrrrr/Epsic.Rpg.git - git checkout Ex1 ::: - Dans le `CharactersController` implémenter les routes suivantes : - `/characters/getall` Retourne la liste de `Character` `{Id:1, Name: Pierre}, {Id:2, Name: Paul} et {Id:3, Name: Jacques}`. - `/characters/getsingle/{id}` Retourne le `Character` ayant l'id spécifié. - `personnages?nom={nom}` Retourne les personnes qui contiennent la chaîne de caractère passée en paramètre, ex: `personnages?nom=p` retourne `{Id:1, Name: Pierre}` et `{Id:2, Name: Paul}`. :::info Pour valider : `dotnet test .\tests\Epsic.Rpg.Tests\Epsic.Rpg.Tests.csproj --filter TestCategory=Ex1` ::: --- ![](https://i.imgur.com/pFUzBac.png) --- # POST - Avec `GET` on réupéré des données, maintenant, pour envoyer des données au serveur on va utiliser la méthode `POST`. > La méthode POST est utilisée pour soumettre une entité à la route spécifiée, ce **DOIT** entraîner un changement d'état ou une création de données. - Cela veut dire que, si maintenant on veut insérer un `Character` on devra ajouter un endpoint `[HttpPost]` à notre `CharactersController` qui ajoutera l'élément envoyé par le client à la liste. --- # POST Implémentation ```csharp [HttpPost("characters")] public IActionResult AddCharacter(Character newCharacter) { _characters.Add(newCharacter); return Ok(_characters.FirstOrDefault(c => c.Id == newCharacter.Id); } ``` ![](https://i.imgur.com/HicmzF5.png) --- # DELETE - La requête `DELETE` est utilisée pour supprimer une ressource du serveur. Contrairement à la requête `GET`, les requêtes `DELETE` *peuvent* modifier l'état du serveur. > La méthode `DELETE` est définie comme **idempotente**, ce qui signifie que plusieurs requêtes `DELETE` identiques doivent avoir le même effet qu'une seule demande. - Cela veut dire que la première requête qui supprimera la donnée retournera un statut HTTP 200 OK et que les suivantes, alors que l'objet en question a déjà été supprimé, retourneront exactement le même statut. --- # DELETE Implémentation ```csharp [HttpDelete("characters/{id}")] public IActionResult Delete(int id) { _characters.Remove(_characters.FirstOrDefault(c => c.Id == id)); return Ok(); } ``` ![](https://i.imgur.com/Q4LRxGV.png) --- # PUT/PATCH - `PUT` Met à jour une ressource complète en la remplaçant par une nouvelle version - `PATCH` Met à jour une partie d’une ressource en envoyant le différentiel - Lorsque l'on souhaite mettre à jour une ressource avec une requête PUT, on doit envoyer le contenu de la ressource intégralement alors qu’avec PATCH, on n’envoie que les valeurs que l'on souhaite modifier. - Exemple : > Supposons que nous ayons une ressource Client et que nous souhaitons modifier uniquement son IBAN. Avec PUT nous devons envoyer la totalité des valeurs des propriétés de la ressource client incluant la valeur de la propriété IBAN, alors qu’avec PATCH nous n’enverrons uniquement que la valeur de la propriété IBAN modifiée et l'ID pour déterminer de quel client l'on souhaite modifier l'IBAN. --- # PUT Implémentation ```csharp= [HttpPut("characters")] public IActionResult Put(Character character) { _characters.Remove(_characters.FirstOrDefault(c => c.Id == character.Id)); _characters.Add(character); return Ok(_characters.FirstOrDefault(c => c.Id == character.Id)); } ``` ![](https://i.imgur.com/w2ABE2o.png) --- # PATCH Implémentation ```csharp= [HttpPatch("characters")] public IActionResult Patch(CharacterPatchViewModel character) { var characterServer = _characters.FirstOrDefault(c => c.Id == character.Id); characterServer.Name = character.Name; return Ok(characterServer); } ``` ![](https://i.imgur.com/n0Q1Ptg.png) --- # Exercice #2 :::info - git commit -am "finished ex1" - git fetch - git checkout Ex2 ::: - Dans le `CharactersController` : - `POST(/characters)` qui prend das le body un `Character` et l'ajoute à la liste - `DELETE(/characters/{id})` qui prend en paramètre l'id du `Character` et le supprime de la liste - `PATCH(/characters)` qui prend dans le body un `CharacterPatchViewModel` et qui met à jour le nom du personnage dans la liste - `PUT(/characters)` qui prend dans le body un `Character` et remplace le personnage correspondant dans la liste :::info Pour valider : `dotnet test .\tests\Epsic.Rpg.Tests\Epsic.Rpg.Tests.csproj --filter TestCategory=Ex2` :::
{"metaMigratedAt":"2023-06-15T14:34:45.118Z","metaMigratedFrom":"YAML","title":"I-CH 151 - 1. ASP.NET Core Routing","breaks":true,"slideOptions":"{\"theme\":\"moonl\",\"spotlight\":{\"enabled\":false}}","contributors":"[{\"id\":\"2ff8bf3a-d09c-4308-a7a7-64e5fb1c4783\",\"add\":8566,\"del\":1290}]"}
    286 views