{"id":748,"date":"2023-01-17T09:40:31","date_gmt":"2023-01-17T09:40:31","guid":{"rendered":"https:\/\/oussamasaidi.com\/?p=748"},"modified":"2025-12-20T11:14:44","modified_gmt":"2025-12-20T11:14:44","slug":"swagger-ui-asp-net-core-web-api","status":"publish","type":"post","link":"https:\/\/oussamasaidi.com\/en\/swagger-ui-asp-net-core-web-api\/","title":{"rendered":"Configuration et utilisation de Swagger UI dans ASP.NET Core Web API"},"content":{"rendered":"<p>Dans cet article, nous allons apprendre \u00e0 int\u00e9grer l&rsquo;interface utilisateur Swagger UI dans une application API Web ASP.NET Core.&nbsp; <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Pour t\u00e9l\u00e9charger le code source de cet article, vous pouvez visiter notre <a href=\"https:\/\/github.com\/oussama-saidi\/swagger-ui-asp-net-core\" target=\"_blank\" rel=\"noopener\" title=\"\">d\u00e9p\u00f4t GitHub<\/a> .<\/p>\n<\/blockquote>\n\n\n\n<p>Plongeons dedans.<\/p>\n\n\n<ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-pourquoi-devrions-nous-documenter-notre-api\">Pourquoi devrions-nous documenter notre API<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-swagger-openapi\">Swagger UI\/OpenAPI<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-integration-de-linterface-utilisateur-swagger-dans-nos-applications\">Int\u00e9gration de Swagger UI dans nos applications<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-installation-du-paquet\">Installation du paquet<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-configuration-du-middleware-swagger\">Configuration du middleware Swagger UI<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-explorer-linterface-utilisateur-swagger\">Explorer Swagger UI<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-extension-et-personnalisation\">Extension et personnalisation<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-enrichir-la-documentation\">Enrichir la documentation<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-informations-et-description-de-lapi\">Informations et description de l&#039;API<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-commentaires-xml\">Commentaires XML<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-utilisation-des-annotations-de-donnees\">Utilisation des annotations de donn\u00e9es<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-description-des-types-de-reponse\">Description des types de r\u00e9ponse<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-personnalisation-de-linterface-utilisateur\">Personnalisation de l&#039;interface utilisateur<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-conclusion\">Conclusion<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-derniers-articles\">Derniers articles<\/a><\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-pourquoi-devrions-nous-documenter-notre-api\">Pourquoi devrions-nous documenter notre API<\/h2>\n\n\n\n<p>Lorsque les d\u00e9veloppeurs consomment des API, ils veulent probablement essayer de r\u00e9soudre des probl\u00e8mes commerciaux importants. Par cons\u00e9quent, il est tr\u00e8s important pour eux de comprendre comment utiliser efficacement les API. C&rsquo;est l\u00e0 que la documentation de l&rsquo;API entre en jeu.<\/p>\n\n\n\n<p>La documentation de l&rsquo;API est le processus consistant \u00e0 donner des instructions sur la mani\u00e8re d&rsquo;utiliser et d&rsquo;int\u00e9grer efficacement une API. Ainsi, il peut \u00eatre consid\u00e9r\u00e9 comme un manuel de r\u00e9f\u00e9rence concis contenant toutes les informations n\u00e9cessaires pour travailler avec une API, avec des d\u00e9tails sur les fonctions, les classes, les types de retour, les arguments, et bien plus encore, soutenus par des tutoriels et des exemples.<\/p>\n\n\n\n<p><strong>Ainsi, disposer de la documentation appropri\u00e9e pour une API permet aux consommateurs d&rsquo;int\u00e9grer cette API le plus rapidement possible<\/strong> et d&rsquo;avancer dans leur d\u00e9veloppement. En outre, cela les aide \u00e9galement \u00e0 <strong>comprendre la valeur et l&rsquo;utilisation de l&rsquo;API, am\u00e9liore les chances d&rsquo;adoption de l&rsquo;API et facilite la maintenance et la prise en charge des API en g\u00e9n\u00e9ral<\/strong> .<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-swagger-openapi\">Swagger UI\/OpenAPI<\/h2>\n\n\n\n<p>Bon, parlons d&rsquo;un outil que nous allons utiliser pour cr\u00e9er la documentation de l&rsquo;API.<\/p>\n\n\n\n<p>Swagger est un ensemble d&rsquo;outils cr\u00e9\u00e9s par la soci\u00e9t\u00e9 SmartBear pour nous aider dans le processus de production et de documentation de l&rsquo;API. <strong>Bien que nous entendions toujours Swagger \u00eatre appel\u00e9 OpenAPI, ce n&rsquo;est plus vrai<\/strong> . OpenAPI fait r\u00e9f\u00e9rence \u00e0 la sp\u00e9cification standard de l&rsquo;industrie pour la conception d&rsquo;API RESTful.<\/p>\n\n\n\n<p><strong>En bref, OpenAPI est une sp\u00e9cification standard de l&rsquo;industrie pour les API Restful, et Swagger est compos\u00e9 des outils utilis\u00e9s pour impl\u00e9menter OpenAPI.<\/strong><\/p>\n\n\n\n<p>Les outils Swagger open source se composent de&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00c9diteur Swagger<\/li>\n\n\n\n<li>Swagger Codegen<\/li>\n\n\n\n<li>Interface utilisateur Swagger<\/li>\n<\/ul>\n\n\n\n<p>Dans ce didacticiel, nous allons parler de la configuration et de l&rsquo;utilisation de l&rsquo;interface utilisateur Swagger.<\/p>\n\n\n\n<p>Swagger UI offre une interface Web qui permet \u00e0 quiconque d&rsquo;interagir avec l&rsquo;API sans avoir \u00e0 conna\u00eetre l&rsquo;impl\u00e9mentation. Il est g\u00e9n\u00e9r\u00e9 automatiquement \u00e0 partir de notre sp\u00e9cification OpenAPI et permet une visualisation facile de la documentation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-integration-de-linterface-utilisateur-swagger-dans-nos-applications\">Int\u00e9gration de Swagger UI dans nos applications<\/h2>\n\n\n\n<p>Nous pouvons utiliser le package Swashbuckle pour int\u00e9grer facilement Swagger dans nos projets d&rsquo;API Web .NET Core. Il g\u00e9n\u00e9rera la sp\u00e9cification Swagger pour notre projet. De plus, l&rsquo;interface utilisateur Swagger est \u00e9galement contenue dans Swashbuckle.<\/p>\n\n\n\n<p>Il y a trois composants principaux dans le package Swashbuckle&nbsp;:<\/p>\n\n\n\n<p><code>Swashbuckle.AspNetCore.Swagger<\/code>: Cela contient le mod\u00e8le d&rsquo;objet Swagger et le middleware pour exposer les objets SwaggerDocument en tant que JSON.<\/p>\n\n\n\n<p><code>Swashbuckle.AspNetCore.SwaggerGen<\/code>: Un g\u00e9n\u00e9rateur Swagger qui construit des objets SwaggerDocument directement \u00e0 partir de nos itin\u00e9raires, contr\u00f4leurs et mod\u00e8les.&nbsp;<\/p>\n\n\n\n<p><code>Swashbuckle.AspNetCore.SwaggerUI<\/code>: Une version int\u00e9gr\u00e9e de l&rsquo;outil d&rsquo;interface utilisateur Swagger. Il interpr\u00e8te Swagger JSON pour cr\u00e9er une exp\u00e9rience riche et personnalisable pour d\u00e9crire la fonctionnalit\u00e9 de l&rsquo;API Web.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-installation-du-paquet\">Installation du paquet<\/h3>\n\n\n\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 installer le package Swashbuckle.<\/p>\n\n\n\n<p>Nous pouvons ex\u00e9cuter la commande suivante dans la fen\u00eatre de la console du gestionnaire de packages&nbsp;:<\/p>\n\n\n\n<p><code>Install-Package Swashbuckle.AspNetCore -version 6.1.4<\/code><\/p>\n\n\n\n<p>Cela installera le package Swashbuckle dans notre application. Vous pouvez mettre \u00e0 niveau la version de votre c\u00f4t\u00e9, mais cet article est compatible avec la version 6.1.4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-configuration-du-middleware-swagger\">Configuration du middleware Swagger UI<\/h3>\n\n\n\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 configurer le Swagger Middleware.<\/p>\n\n\n\n<p>Apportons les changements suivants dans la <code>ConfigureServices()<\/code>m\u00e9thode de la <code>Startup.cs<\/code> classe&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void ConfigureServices(IServiceCollection services)\n{\n    \/\/ Register the Swagger generator, defining 1 or more Swagger documents\n    services.AddSwaggerGen(c =>\n    {\n        c.SwaggerDoc(\"v1\", new OpenApiInfo { Title = \"My API\", Version = \"v1\" });                \n    });\n    services.AddControllers();\n}<\/pre>\n\n\n\n<p>Par cons\u00e9quent, cela ajoute le g\u00e9n\u00e9rateur Swagger \u00e0 la collection de services. <\/p>\n\n\n\n<p>Dans la <code>Configure()<\/code> m\u00e9thode, activons le middleware pour servir le document JSON g\u00e9n\u00e9r\u00e9 et l&rsquo;interface utilisateur Swagger&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n{\n    \/\/ Enable middleware to serve generated Swagger as a JSON endpoint.\n    app.UseSwagger();\n    \/\/ Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),\n    \/\/ specifying the Swagger JSON endpoint.\n    app.UseSwaggerUI(c =>\n    {\n        c.SwaggerEndpoint(\"\/swagger\/v1\/swagger.json\", \"My API V1\");\n    });\n}<\/pre>\n\n\n\n<p>En ex\u00e9cutant ces \u00e9tapes, le Swagger est configur\u00e9 et pr\u00eat \u00e0 \u00eatre utilis\u00e9 dans notre projet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-explorer-linterface-utilisateur-swagger\">Explorer Swagger UI<\/h3>\n\n\n\n<p>Dans un premier temps, nous allons cr\u00e9er une classe <code>Employee<\/code> : <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Employee\n{\n    public int Id { get; set; }\n    public string FirstName { get; set; }\n    public string LastName { get; set; }\n    public string EmailId { get; set; }\n}<\/pre>\n\n\n\n<p>Ensuite, cr\u00e9ons un contr\u00f4leur d&rsquo;API avec des m\u00e9thodes d&rsquo;action. Nous allons utiliser des donn\u00e9es fictives et nous concentrer sur la compr\u00e9hension des capacit\u00e9s de Swagger&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[Route(\"api\/[controller]\")]\n    [ApiController]\n    public class EmployeeController : ControllerBase\n    {\n        \/\/\/ &lt;summary>\n        \/\/\/ Gets the list of all Employees.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;returns>The list of Employees.&lt;\/returns>\n        \/\/ GET: api\/Employee\n        [HttpGet]\n        public IEnumerable&lt;Employee> Get()\n        {\n            return GetEmployees();\n        }\n\n        \/\/ GET: api\/Employee\/5\n        [HttpGet(\"{id}\", Name = \"Get\")]\n        public Employee Get(int id)\n        {\n            return GetEmployees().Find(e => e.Id == id);\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Creates an Employee.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;remarks>\n        \/\/\/ Sample request:\n        \/\/\/ \n        \/\/\/     POST api\/Employee\n        \/\/\/     {        \n        \/\/\/       \"firstName\": \"Oussama\",\n        \/\/\/       \"lastName\": \"Saidi\",\n        \/\/\/       \"emailId\": \"oussama.saidisbz@gmail.com\"        \n        \/\/\/     }\n        \/\/\/ &lt;\/remarks>\n        \/\/\/ &lt;param name=\"employee\">&lt;\/param>\n        \/\/\/ &lt;returns>A newly created employee&lt;\/returns>\n        \/\/\/ &lt;response code=\"201\">Returns the newly created item&lt;\/response>\n        \/\/\/ &lt;response code=\"400\">If the item is null&lt;\/response>          \n        [HttpPost]\n        [ProducesResponseType(201)]\n        [ProducesResponseType(400)]\n        [Produces(\"application\/json\")]\n        public Employee Post([FromBody] Employee employee)\n        {\n            \/\/ Logic to create new Employee\n            return new Employee();\n        }\n\n        \/\/ PUT: api\/Employee\/5\n        [HttpPut(\"{id}\")]\n        public void Put(int id, [FromBody] Employee employee)\n        {\n            \/\/ Logic to update an Employee\n        }\n\n        \/\/ DELETE: api\/Employee\/5\n        [HttpDelete(\"{id}\")]\n        public void Delete(int id)\n        {\n        }\n\n        private List&lt;Employee> GetEmployees()\n        {\n            return new List&lt;Employee>()\n        {\n            new Employee()\n            {\n                Id = 1,\n                FirstName= \"Oussama\",\n                LastName = \"Saidi\",\n                EmailId =\"oussama.saidisbz@gmail.com\"\n            },\n            new Employee()\n            {\n                Id = 2,\n                FirstName= \"Jane\",\n                LastName = \"Doe\",\n                EmailId =\"Jane.Doe@gmail.com\"\n            }\n        };\n        }\n    }<\/pre>\n\n\n\n<p>Maintenant, lan\u00e7ons l&rsquo;application et naviguons vers <code>https:\/\/localhost:&lt;port&gt;\/swagger\/v1\/swagger.json<\/code>. Nous pouvons voir qu&rsquo;un document d\u00e9crivant les endpoints est g\u00e9n\u00e9r\u00e9&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"680\" height=\"795\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image.png\" alt=\"Swagger UI\" class=\"wp-image-760\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image.png 680w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-257x300.png 257w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-10x12.png 10w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-219x256.png 219w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/><\/figure>\n\n\n\n<p>Pour inspecter l&rsquo;interface utilisateur Swagger, nous pouvons acc\u00e9der \u00e0 <code>https:\/\/localhost:&lt;port&gt;\/swagger<\/code>&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"411\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-1024x411.png\" alt=\"Swagger UI \" class=\"wp-image-791\" style=\"width:900px;height:361px\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-1024x411.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-300x120.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-768x308.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-1536x616.png 1536w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-2048x822.png 2048w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-18x7.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-256x103.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-950x381.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-15-1920x770.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Nous pouvons maintenant explorer l&rsquo;API via l&rsquo;interface utilisateur Swagger et il sera plus facile de l&rsquo;int\u00e9grer \u00e0 d&rsquo;autres applications. De plus, nous pouvons voir chaque contr\u00f4leur et ses m\u00e9thodes d&rsquo;action.<\/p>\n\n\n\n<p>Une fois que nous avons cliqu\u00e9 sur une m\u00e9thode d&rsquo;action, nous pouvons voir des informations d\u00e9taill\u00e9es telles que les param\u00e8tres, la r\u00e9ponse et des exemples de valeurs. Il existe \u00e9galement une option pour essayer chacune de ces m\u00e9thodes d&rsquo;action&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"996\" height=\"968\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2.png\" alt=\"Swagger UI\" class=\"wp-image-764\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2.png 996w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2-300x292.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2-768x746.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2-12x12.png 12w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2-256x249.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-2-950x923.png 950w\" sizes=\"(max-width: 996px) 100vw, 996px\" \/><\/figure>\n\n\n\n<p>En cliquant sur le bouton \u00ab\u00a0Essayer\u00a0\u00bb, nous pouvons tester le point de terminaison et voir la r\u00e9ponse&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"693\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-1024x693.png\" alt=\"Swagger UI\" class=\"wp-image-767\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-1024x693.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-300x203.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-768x519.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-18x12.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-256x173.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4-950x642.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-4.png 1452w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-extension-et-personnalisation\">Extension et personnalisation&nbsp;<\/h2>\n\n\n\n<p>Swagger fournit des options pour \u00e9tendre la documentation et personnaliser l&rsquo;interface utilisateur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-enrichir-la-documentation\">Enrichir la documentation<\/h3>\n\n\n\n<p>Regardons les diff\u00e9rentes options pour \u00e9tendre la documentation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-informations-et-description-de-lapi\">Informations et description de l&rsquo;API<\/h4>\n\n\n\n<p>Voyons d&rsquo;abord comment nous pouvons sp\u00e9cifier les informations et la description de l&rsquo;API.<\/p>\n\n\n\n<p>L&rsquo; <code>configuration<\/code> action transmise \u00e0 la <code>AddSwaggerGen()<\/code>m\u00e9thode ajoute des informations telles que le contact, la licence et la description. Donnons quelques valeurs pour ceux-ci&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ This method gets called by the runtime. Use this method to add services to the container.\npublic void ConfigureServices(IServiceCollection services)\n{\n    \/\/ Register the Swagger generator, defining 1 or more Swagger documents\n    services.AddSwaggerGen(c =>\n    {\n        c.SwaggerDoc(\"v1\", new OpenApiInfo\n        {\n            Title = \"Employee API\",\n            Version = \"v1\",\n            Description = \"An API to perform Employee operations\",\n            TermsOfService = new Uri(\"https:\/\/example.com\/terms\"),\n            Contact = new OpenApiContact\n            {\n                Name = \"John Walkner\",\n                Email = \"John.Walkner@gmail.com\",\n                Url = new Uri(\"https:\/\/twitter.com\/jwalkner\"),\n            },\n            License = new OpenApiLicense\n            {\n                Name = \"Employee API LICX\",\n                Url = new Uri(\"https:\/\/example.com\/license\"),\n            }\n        });\n    });\n}<\/pre>\n\n\n\n<p>Ex\u00e9cutons \u00e0 nouveau l&rsquo;application et explorons l&rsquo;interface utilisateur Swagger&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"508\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-1024x508.png\" alt=\"\" class=\"wp-image-785\" style=\"width:917px;height:454px\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-1024x508.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-300x149.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-768x381.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-1536x762.png 1536w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-2048x1016.png 2048w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-18x9.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-256x127.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-950x471.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-12-1920x952.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Nous pouvons voir que le document Swagger est maintenant mis \u00e0 jour avec API Info.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-commentaires-xml\">Commentaires XML<\/h4>\n\n\n\n<p>Pour activer les commentaires XML, nous devons suivre les \u00e9tapes suivantes&nbsp;:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Dans l&rsquo;onglet Build des propri\u00e9t\u00e9s du projet, cochez la case intitul\u00e9e <code>XML documentation file<\/code>. Conservons le chemin du fichier g\u00e9n\u00e9r\u00e9 automatiquement.<\/li>\n\n\n\n<li>Supprimer l&rsquo;avertissement 1591, qui donnera d\u00e9sormais des avertissements sur toute m\u00e9thode, classe ou champ qui n&rsquo;a pas de commentaires \u00e0 triple barre oblique.<img decoding=\"async\" id=\"fancybox-img\" src=\"https:\/\/code--maze-com.translate.goog\/wp-content\/uploads\/2019\/10\/generate-xml-documentation-setting.png?_x_tr_sl=en&amp;_x_tr_tl=fr&amp;_x_tr_hl=fr&amp;_x_tr_pto=wapp\" alt=\"\"><\/li>\n<\/ol>\n\n\n\n<p>Dans la <code>ConfigureServices()<\/code>m\u00e9thode, configurez Swagger pour utiliser le fichier XML g\u00e9n\u00e9r\u00e9 \u00e0 l&rsquo;\u00e9tape ci-dessus&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void ConfigureServices(IServiceCollection services)\n{\n    \/\/ Register the Swagger generator, defining 1 or more Swagger documents\n    services.AddSwaggerGen(c =>\n    {\n        c.SwaggerDoc(\"v1\", new OpenApiInfo\n        {\n            Title = \"Employee API\",\n            Version = \"v1\",\n            Description = \"An API to perform Employee operations\",\n            TermsOfService = new Uri(\"https:\/\/example.com\/terms\"),\n            Contact = new OpenApiContact\n            {\n                Name = \"Oussama Saidi\",\n                Email = \"oussama.saidisbz@gmail.com\",\n                Url = new Uri(\"https:\/\/twitter.com\/OsaidiPro\"),\n            },\n            License = new OpenApiLicense\n            {\n                Name = \"Employee API LICX\",\n                Url = new Uri(\"https:\/\/example.com\/license\"),\n            }\n        });\n        \/\/ Set the comments path for the Swagger JSON and UI.\n        var xmlFile = $\"{Assembly.GetExecutingAssembly().GetName().Name}.xml\";\n        var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);\n        c.IncludeXmlComments(xmlPath);\n    });\n    services.AddControllers();\n}<\/pre>\n\n\n\n<p>D\u00e9sormais, l&rsquo;ajout de commentaires \u00e0 triple barre oblique \u00e0 la m\u00e9thode d&rsquo;action am\u00e9liore l&rsquo;interface utilisateur Swagger en ajoutant une description \u00e0 l&rsquo;en-t\u00eate de section.<\/p>\n\n\n\n<p>Ajoutons un r\u00e9sum\u00e9 :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1-3\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\/ &lt;summary>\n\/\/\/ Gets the list of all Employees.\n\/\/\/ &lt;\/summary>\n\/\/\/ &lt;returns>The list of Employees.&lt;\/returns>\n\/\/ GET: api\/Employee\n[HttpGet]\npublic IEnumerable&lt;Employee> Get()\n{\n    return GetEmployees();\n}<\/pre>\n\n\n\n<p>Cela affiche le r\u00e9sum\u00e9 par rapport \u00e0 la m\u00e9thode d&rsquo;action&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1001\" height=\"240\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6.png\" alt=\"\" class=\"wp-image-771\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6.png 1001w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6-300x72.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6-768x184.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6-18x4.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6-256x61.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-6-950x228.png 950w\" sizes=\"(max-width: 1001px) 100vw, 1001px\" \/><\/figure>\n\n\n\n<p>Nous pouvons en outre ajouter des <code>&lt;remarks&gt;<\/code> \u00e9l\u00e9ments \u00e0 la documentation. Il compl\u00e8te les informations sp\u00e9cifi\u00e9es dans l&rsquo; <code>&lt;summary&gt;<\/code> \u00e9l\u00e9ment et fournit une interface utilisateur Swagger plus robuste. Le <code>&lt;remarks&gt;<\/code> contenu de l&rsquo;\u00e9l\u00e9ment peut \u00eatre compos\u00e9 de texte, JSON ou XML&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"4-13\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\/ &lt;summary>\n\/\/\/ Creates an Employee.\n\/\/\/ &lt;\/summary>\n\/\/\/ &lt;remarks>\n\/\/\/ Sample request:\n\/\/\/ \n\/\/\/     POST api\/Employee\n\/\/\/     {        \n\/\/\/       \"firstName\": \"Mike\",\n\/\/\/       \"lastName\": \"Andrew\",\n\/\/\/       \"emailId\": \"Mike.Andrew@gmail.com\"        \n\/\/\/     }\n\/\/\/ &lt;\/remarks>\n\/\/\/ &lt;param name=\"employee\">&lt;\/param>        \n[HttpPost]\n[Produces(\"application\/json\")]\npublic Employee Post([FromBody] Employee employee)\n{\n    \/\/ Logic to create new Employee\n    return new Employee();\n}<\/pre>\n\n\n\n<p>Cela am\u00e9liorera l&rsquo;interface utilisateur avec des informations suppl\u00e9mentaires&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"906\" height=\"418\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-7.png\" alt=\"\" class=\"wp-image-775\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-7.png 906w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-7-300x138.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-7-768x354.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-7-18x8.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-7-256x118.png 256w\" sizes=\"(max-width: 906px) 100vw, 906px\" \/><\/figure>\n\n\n\n<p>Nous avons appris \u00e0 am\u00e9liorer la documentation \u00e0 l&rsquo;aide de commentaires XML.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-utilisation-des-annotations-de-donnees\">Utilisation des annotations de donn\u00e9es<\/h4>\n\n\n\n<p>Nous pouvons d\u00e9corer un mod\u00e8le avec des attributs pour am\u00e9liorer la documentation.<\/p>\n\n\n\n<p>Ajoutons un <code>[Required]<\/code>attribut au <code>EmailId<\/code> champ du <code>Employee<\/code> mod\u00e8le&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"6\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Employee\n{\n    public int Id { get; set; }\n    public string FirstName { get; set; }\n    public string LastName { get; set; }\n    [Required]\n    public string EmailId { get; set; }\n}<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"689\" height=\"402\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-8.png\" alt=\"\" class=\"wp-image-777\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-8.png 689w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-8-300x175.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-8-18x12.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-8-256x149.png 256w\" sizes=\"(max-width: 689px) 100vw, 689px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-description-des-types-de-reponse\">Description des types de r\u00e9ponse<\/h4>\n\n\n\n<p>Les d\u00e9veloppeurs qui utilisent nos API sont g\u00e9n\u00e9ralement plus int\u00e9ress\u00e9s par ce qu&rsquo;elles renvoient, en particulier les types de r\u00e9ponse et les codes d&rsquo;erreur. Il est donc tr\u00e8s important de d\u00e9crire nos types de r\u00e9ponses. Ceux-ci sont indiqu\u00e9s \u00e0 l&rsquo;aide de commentaires XML et d&rsquo;annotations de donn\u00e9es.<\/p>\n\n\n\n<p>Am\u00e9liorons un peu les types de r\u00e9ponse&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"16,17,19,20\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\/ &lt;summary>\n\/\/\/ Creates an Employee.\n\/\/\/ &lt;\/summary>\n\/\/\/ &lt;remarks>\n\/\/\/ Sample request:\n\/\/\/ \n\/\/\/     POST api\/Employee\n\/\/\/     {        \n\/\/\/       \"firstName\": \"Oussama\",\n\/\/\/       \"lastName\": \"Saidi\",\n\/\/\/       \"emailId\": \"oussama.saidisbz@gmail.com\"        \n\/\/\/     }\n\/\/\/ &lt;\/remarks>\n\/\/\/ &lt;param name=\"employee\">&lt;\/param>\n\/\/\/ &lt;returns>A newly created employee&lt;\/returns>\n\/\/\/ &lt;response code=\"201\">Returns the newly created item&lt;\/response>\n\/\/\/ &lt;response code=\"400\">If the item is null&lt;\/response>          \n[HttpPost]\n[ProducesResponseType(201)]\n[ProducesResponseType(400)]\n[Produces(\"application\/json\")]\npublic Employee Post([FromBody] Employee employee)\n{\n    \/\/ Logic to create new Employee\n    return new Employee();\n}<\/pre>\n\n\n\n<p>Cela se refl\u00e9tera dans la section R\u00e9ponses&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"952\" height=\"717\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9.png\" alt=\"\" class=\"wp-image-779\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9.png 952w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9-300x226.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9-768x578.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9-16x12.png 16w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9-256x193.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-9-950x715.png 950w\" sizes=\"(max-width: 952px) 100vw, 952px\" \/><\/figure>\n\n\n\n<p>Dans cette section, nous avons examin\u00e9 diverses options pour \u00e9tendre la documentation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-personnalisation-de-linterface-utilisateur\">Personnalisation de l&rsquo;interface utilisateur<\/h3>\n\n\n\n<p>L&rsquo;interface utilisateur par d\u00e9faut de Swagger est plut\u00f4t bonne. Mais nous pouvons le personnaliser si nous le souhaitons. Nous pouvons modifier les pages de documentation pour repr\u00e9senter notre marque ou notre th\u00e8me. La personnalisation des composants Swagger n\u00e9cessite l&rsquo;ajout de ressources pour servir les fichiers statiques et la cr\u00e9ation de la structure de dossiers pour h\u00e9berger ces fichiers.<\/p>\n\n\n\n<p>Tout d&rsquo;abord, nous allons activer le middleware de fichier statique dans la <code>Configure()<\/code>m\u00e9thode du <code>Startup.cs<\/code> fichier&nbsp;:<\/p>\n\n\n\n<p>app.UseStaticFiles();<\/p>\n\n\n\n<p>Apr\u00e8s cela, acqu\u00e9rons le contenu du <code>dist<\/code> dossier \u00e0 partir du <a href=\"https:\/\/github.com\/swagger-api\/swagger-ui\/tree\/master\/dist\" target=\"_blank\" rel=\"noopener\" title=\"\">r\u00e9f\u00e9rentiel<\/a> Swagger UI GitHub . Ce dossier contient les ressources n\u00e9cessaires pour la page de l&rsquo;interface utilisateur Swagger.<\/p>\n\n\n\n<p>Cr\u00e9ons un <code>wwwroot\/swagger\/ui<\/code> dossier et copions-y le contenu du dossier dist.<\/p>\n\n\n\n<p>De plus, cr\u00e9ons un <code>custom.css<\/code> fichier <code>wwwroot\/swagger\/ui<\/code> avec le CSS suivant pour personnaliser l&rsquo;en-t\u00eate de la page&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"css\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">.swagger-ui .topbar {\n    background-color: grey;\n    border-bottom: 3px solid black;\n}<\/pre>\n\n\n\n<p>Nous devons r\u00e9f\u00e9rencer <em>custom.css<\/em> dans le <code>index.html<\/code> fichier \u00e0 l&rsquo;int\u00e9rieur du dossier UI, apr\u00e8s tout autre fichier CSS&nbsp;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;link rel=\"stylesheet\" type=\"text\/css\" href=\".\/swagger-ui.css\">\n&lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"custom.css\"><\/pre>\n\n\n\n<p>Enfin, naviguons jusqu&rsquo;\u00e0 la <code>index.html<\/code> page \u00e0 <code>https:\/\/localhost:&lt;port&gt;\/swagger\/ui\/index.html<\/code>, entrez <code>https:\/\/localhost:&lt;port&gt;\/swagger\/v1\/swagger.json<\/code> dans la zone de texte de l&rsquo;en-t\u00eate et cliquez sur le bouton Explorer.&nbsp;<\/p>\n\n\n\n<p>Nous pouvons voir que l&rsquo;interface utilisateur est maintenant personnalis\u00e9e avec les modifications que nous avons apport\u00e9es&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"437\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-1024x437.png\" alt=\"\" class=\"wp-image-786\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-1024x437.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-300x128.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-768x328.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-1536x655.png 1536w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-2048x874.png 2048w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-18x8.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-256x109.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-950x405.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/image-13-1920x819.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u00c0 ce stade, nous connaissons les diff\u00e9rentes options de personnalisation de l&rsquo;interface utilisateur Swagger.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\">Conclusion<\/h2>\n\n\n\n<p>Nous avons examin\u00e9 les sujets suivants dans cet article&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le besoin de documenter nos API<\/li>\n\n\n\n<li>Swagger\/OpenAPI &#8211; Sp\u00e9cification Swagger et interface utilisateur Swagger<\/li>\n\n\n\n<li>Int\u00e9gration de l&rsquo;interface utilisateur Swagger dans une API Web ASP.NET Core<\/li>\n\n\n\n<li>Extension de la documentation Swagger<\/li>\n\n\n\n<li>Personnalisation de l&rsquo;interface utilisateur Swagger<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-derniers-articles\">Derniers articles<\/h2>\n\n\n\n<ul id=\"block-f13d0a51-4411-4908-a130-53c07d8737e7\" class=\"wp-block-list\">\n<li><a href=\"https:\/\/oussamasaidi.com\/en\/hangfire-avec-asp-net-core\/\">Hangfire avec ASP.NET Core<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/oussamasaidi.com\/en\/automapper-net-core\/\">Premiers pas avec AutoMapper dans ASP.NET Core<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/oussamasaidi.com\/en\/serilog-in-aspnet-core-3-1\/\">Serilog dans ASP.NET Core 3.1-La journalisation structur\u00e9e simplifi\u00e9e<\/a>\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div class=\"is-layout-flex wp-container-3 wp-block-columns alignwide\">\n<div class=\"is-layout-flow wp-elements-335e63358524de319c4ff171bbc01eee wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 id=\"patron\" style=\"font-size:40px\"><strong>Vous aimez le contenu&nbsp;?<\/strong><\/h2>\n\n\n\n<p class=\"has-normal-font-size\"><strong>Si vous aimez mes articles, pensez \u00e0 m\u2019acheter quelques caf\u00e9s !<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\">\n\n\n\n<div class=\"is-horizontal is-content-justification-center is-layout-flex wp-container-1 wp-block-buttons alignfull\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" href=\"https:\/\/www.buymeacoffee.com\/oussamasaiI\" style=\"background-color:#000000\" target=\"_blank\" rel=\"noreferrer noopener\">Achetez-moi un caf\u00e9<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Dans cet article, nous allons apprendre \u00e0 int\u00e9grer l&rsquo;interface utilisateur Swagger UI dans une application API Web ASP.NET Core.&nbsp; Pour&#8230; <\/p>\n<div class=\"art-el-more\"><a href=\"https:\/\/oussamasaidi.com\/en\/swagger-ui-asp-net-core-web-api\/\" class=\"art-link art-color-link art-w-chevron\">Read more<\/a><\/div>","protected":false},"author":1,"featured_media":749,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[40,45,56,60,61],"tags":[],"ppma_author":[286],"class_list":["post-748","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-netcore","category-asp-net","category-c-2","category-swagger-ui","category-web-api"],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2023\/01\/swaggeruidotnetcore.jpg","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1325,"url":"https:\/\/oussamasaidi.com\/en\/building-professional-modern-api-documentation-in-net-core-with-scalar\/","url_meta":{"origin":748,"position":0},"title":"Building Professional, Modern API Documentation in .NET Core with Scalar","author":"Saidi Oussama","date":"November 19, 2025","format":false,"excerpt":"Introduction In today\u2019s software ecosystem, APIs are everywhere. Whether you are building a mobile application, a microservices architecture, or an internal company platform, your API is often the backbone of the system. But even the best API becomes useless if developers cannot understand how to consume it. This is why\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"Building Professional, Modern API Documentation in .NET Core with Scalar","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1714,"url":"https:\/\/oussamasaidi.com\/en\/https-oussamasaidi-com-restful-api-mastery-best-practices-with-asp-net-core-part-2\/","url_meta":{"origin":748,"position":1},"title":"RESTful API best practices\u00a0with ASP.NET Core Part 2","author":"Saidi Oussama","date":"December 20, 2025","format":false,"excerpt":"Testing, Performance, Security, Microservices & Deployment Introduction: From Solid Foundations to Production Excellence In Part 1 of RESTful API Mastery, we established the architectural and technical foundations required to build reliable, evolvable RESTful APIs with ASP.NET Core. However, a well-designed API only becomes truly valuable when it is tested, observable,\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1639,"url":"https:\/\/oussamasaidi.com\/en\/restful-api-mastery-best-practices-with-asp-net-core\/","url_meta":{"origin":748,"position":2},"title":"RESTful API Best Practices with ASP.NET Core","author":"Saidi Oussama","date":"December 16, 2025","format":false,"excerpt":"Professional Best Practices, Versioning Strategies & Advanced Serialization (Part 1) In this blog Introduction: Building Enterprise-Grade RESTful APIs with ASP.NET Core1. RESTful APIs in the Modern ASP.NET Core EcosystemWhy REST Still Dominates2. REST Architectural Constraints Every ASP.NET Core API Must EnforceClient\u2013Server SeparationStatelessnessUniform Interface3. Establishing a Clean and Scalable ASP.NET Core\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":838,"url":"https:\/\/oussamasaidi.com\/en\/comment-implementer-authentification-cle-api-aspnet-core\/","url_meta":{"origin":748,"position":3},"title":".NET Core : impl\u00e9menter l\u2019authentification par cl\u00e9 API en C#","author":"Saidi Oussama","date":"August 22, 2024","format":false,"excerpt":"ContexteCr\u00e9ation de l'attribut de cl\u00e9 APIImpl\u00e9menter du filtre d'autorisation ApiKeyimpl\u00e9mentation de l'ApiKeyValidatorTester l'APIUtilisez le middlewareConclusionDerniers Articles Vous pouvez trouver le code source complet sur github Contexte Alors, qu\u2019est-ce que l\u2019authentification par cl\u00e9 API dans ASP.NET Core ? Prenons un exemple concret. Imaginez que vous ayez d\u00e9velopp\u00e9 un tableau de bord\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1035,"url":"https:\/\/oussamasaidi.com\/en\/creer-un-chatbot-avec-deepseek-et-net-9-tutoriel-complet\/","url_meta":{"origin":748,"position":4},"title":"Cr\u00e9er un Chatbot avec DeepSeek et .NET 9 : Tutoriel Complet","author":"Saidi Oussama","date":"April 6, 2025","format":false,"excerpt":"Ce tutoriel vous guidera pas \u00e0 pas pour construire un chatbot utilisant l'API de DeepSeek avec .NET 9. Nous allons cr\u00e9er une application web de chatbot avec ASP.NET Core. Pr\u00e9requis\u00c9tape 1 : Cr\u00e9er une nouvelle application Web ASP.NET Core\u00c9tape 2 : Ajouter les packages n\u00e9cessaires\u00c9tape 3 : Cr\u00e9er les mod\u00e8les\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"AI Chatbot with .net core","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w4yx4rdp1ohuvcb96ypg.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w4yx4rdp1ohuvcb96ypg.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w4yx4rdp1ohuvcb96ypg.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w4yx4rdp1ohuvcb96ypg.webp?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1783,"url":"https:\/\/oussamasaidi.com\/en\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends\/","url_meta":{"origin":748,"position":5},"title":"React 19 &amp; Vite: Build Fast Frontends for .NET Developers","author":"Saidi Oussama","date":"December 23, 2025","format":false,"excerpt":"Introduction: Why .NET Developers Need Modern Frontend Tools For many years, ASP.NET developers have focused mainly on server-side rendering using technologies like ASP.NET MVC, Razor Pages, and Blazor. While these frameworks remain powerful, the modern web has evolved rapidly. Today, users expect instant load times, smooth UI interactions, and app-like\u2026","rel":"","context":"In &quot;Non class\u00e9&quot;","block_context":{"text":"Non class\u00e9","link":"https:\/\/oussamasaidi.com\/en\/category\/non-classe-fr\/"},"img":{"alt_text":"react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends-scaled.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends-scaled.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends-scaled.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends-scaled.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends-scaled.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/react-19-and-vite-for-dotnet-developers-build-fast-modern-frontends-scaled.png?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"authors":[{"term_id":286,"user_id":1,"is_guest":0,"slug":"oussama_sa","display_name":"Saidi Oussama","avatar_url":{"url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg","url2x":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg"},"author_category":"1","first_name":"Oussama","last_name":"SAIDI","user_url":"https:\/\/oussamasaidi.com","job_title":"Senior Fullstack .NET Developer","description":"I\u2019m a Senior Fullstack .NET Developer specializing in building scalable, high-performance web applications with .NET, C#, and modern frontend frameworks like React.js. I\u2019m passionate about clean architecture, automated testing, and sharing knowledge through blogs and tutorials."}],"_links":{"self":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/comments?post=748"}],"version-history":[{"count":2,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/748\/revisions"}],"predecessor-version":[{"id":945,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/748\/revisions\/945"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media\/749"}],"wp:attachment":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media?parent=748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/categories?post=748"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/tags?post=748"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/ppma_author?post=748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}