{"id":13413,"date":"2018-12-12T17:06:27","date_gmt":"2018-12-12T19:06:27","guid":{"rendered":"http:\/\/gianfratti.com\/?p=13413"},"modified":"2018-12-12T17:16:02","modified_gmt":"2018-12-12T19:16:02","slug":"swagger-documente-seu-asp-net-web-api-rest","status":"publish","type":"post","link":"https:\/\/gianfratti.com\/index.php\/swagger-documente-seu-asp-net-web-api-rest\/","title":{"rendered":"Swagger \u2013 Documente seu ASP.NET Web API Rest"},"content":{"rendered":"<p><a href=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_00.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13421 size-full\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_00.png\" alt=\"\" width=\"600\" height=\"225\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_00.png 600w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_00-300x113.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><br \/>\nHoje meu post ir\u00e1 falar sobre como podemos documentar nossas <strong>API REST<\/strong>. Documentar nunca foi e nunca ser\u00e1 uma tarefa das mais legais geralmente \u00e9 mon\u00f3tono, cansativo e trabalhoso. Documenta\u00e7\u00e3o tende-se a se perder a longo do tempo e facilmente ficar desatualizado.<!--more--><\/p>\n<p>E ai que surgiu o <strong>Swagger<\/strong>, ele \u00e9 um framework que automatiza a documenta\u00e7\u00e3o, com ele voc\u00ea pode descrever, consumir e visualizar sua <strong>API REST<\/strong>.\u00a0O interessante do <strong>Swagger\u00a0<\/strong>\u00e9 que ele mant\u00e9m sua documenta\u00e7\u00e3o sempre sincronizada tanto no lado cliente quanto no lado servidor j\u00e1 que ele est\u00e1 integrado diretamente ao c\u00f3digo.<\/p>\n<p><strong>Swagger\u00a0<\/strong>\u00e9 um Framework multi linguagem e existem diversas implementa\u00e7\u00f5es nas mais diversas tecnologias e a sua implementa\u00e7\u00e3o para o <strong>ASP.NET Web API<\/strong> se chama <strong>\u201cSwashbuckle\u201d.\u00a0<\/strong>Essa implementa\u00e7\u00e3o facilita nossa vida j\u00e1 que basta adicionar o <strong>Swagger<\/strong> em qualquer projeto <strong>ASP.NET Web API<\/strong> e que como\u00a0um\u00a0passe de m\u00e1gica sua <strong>API<\/strong> ter\u00e1 uma documenta\u00e7\u00e3o maravilhosa. Outra coisa bem legal do <strong>Swagger\u00a0<\/strong>\u00e9 que ele n\u00e3o necessita de nenhuma depend\u00eancia ent\u00e3o basta adicionar o pacote via NuGet para habilitar a documenta\u00e7\u00e3o de sua <strong>API.<\/strong><\/p>\n<p>Ao instalar o pacote\u00a0<strong>Swagger <\/strong>com ele vem incorporado o <strong>Swagger-UI<\/strong> que basicamente \u00e9 uma interface que gera dinamicamente as documenta\u00e7\u00e3o da sua <strong>API<\/strong> e um <strong>Sandbox<\/strong> no qual podemos fazer os testes e a chamadas na nossa <strong>API<\/strong> e tudo isso de forma autom\u00e1tica.<\/p>\n<p>A figura abaixo mostra o <strong>Swagger<\/strong> e sua interface gr\u00e1fica<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13415\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_01.png\" alt=\"\" width=\"1024\" height=\"795\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_01.png 1024w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_01-300x233.png 300w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_01-768x596.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>A figura abaixo mostra o Sandbox do <strong>Swagger<\/strong> aonde podemos realizar os testes<\/p>\n<p><a href=\"http:\/\/rafaelcruz.azurewebsites.net\/wp-content\/uploads\/2016\/08\/swagger2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13416\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_02.png\" alt=\"\" width=\"1024\" height=\"795\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_02.png 1024w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_02-300x233.png 300w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_02-768x596.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<h4>Utilizando o Swagger no ASP.NET Web Api<\/h4>\n<p>Para utilizar o <strong>Swagger<\/strong>, devemos adicionar o <strong>Swagger<\/strong> como depend\u00eancia do nosso projeto, o <strong>Swagger<\/strong> est\u00e1 dispon\u00edvel via NuGet. Execute o comando abaixo no <strong>Package Manager Console<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">Install-Package Swashbuckle\r\n\r\n<\/pre>\n<p>Com o pacote do <strong>Swagger<\/strong> instalado, ele ir\u00e1 criar uma arquivo de inicializa\u00e7\u00e3o (bootstrap) que est\u00e1 localizado em App_Start\/SwaggerConfig.cs.<\/p>\n<p>Agora com precisamos chamar o <strong>Swagger<\/strong> no processo de start up da nossa aplica\u00e7\u00e3o ent\u00e3o vamos abrir a <strong>WebApiConfig.cs<\/strong> e adicionar o c\u00f3digo abaixo<\/p>\n<div>\n<div id=\"highlighter_301581\" class=\"syntaxhighlighter csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">namespace<\/code> <code class=\"csharp plain\">Swagger<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">static<\/code> <code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">WebApiConfig<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">static<\/code> <code class=\"csharp keyword\">void<\/code> <code class=\"csharp plain\">Register(HttpConfiguration config)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/ Web API routes<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">config.MapHttpAttributeRoutes();<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">config.Routes.MapHttpRoute(<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">name: <\/code><code class=\"csharp string\">\"DefaultApi\"<\/code><code class=\"csharp plain\">,<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">routeTemplate: <\/code><code class=\"csharp string\">\"api\/{controller}\/{id}\"<\/code><code class=\"csharp plain\">,<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">defaults: <\/code><code class=\"csharp keyword\">new<\/code> <code class=\"csharp plain\">{ id = RouteParameter.Optional }<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">);<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">SwaggerConfig.Register();<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"csharp plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Vamos agora habilitar o <strong>Swagger<\/strong> para que\u00a0use a documenta\u00e7\u00e3o gerada pelo XML Comments. Para isso devemos primeiro habilitar a gera\u00e7\u00e3o dos xml de documenta\u00e7\u00e3o.<\/p>\n<p>Vamos abrir a propriedades do projeto e marcar a op\u00e7\u00e3o <strong>XML documentation file <\/strong>na aba <strong>build<\/strong>, conforme figura abaixo<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13417\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_03.png\" alt=\"\" width=\"1024\" height=\"557\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_03.png 1024w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_03-300x163.png 300w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_03-768x418.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Com a gera\u00e7\u00e3o de XML Comments habilitada, vamos colocar o <strong>Swagger<\/strong> para ler essa documenta\u00e7\u00e3o. Vamos abrir o <strong>SwaggerConfig.cs<\/strong> e adicionar o c\u00f3digo abaixo:<\/p>\n<div>\n<div id=\"highlighter_353616\" class=\"syntaxhighlighter csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">namespace<\/code> <code class=\"csharp plain\">Swagger<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">SwaggerConfig<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">static<\/code> <code class=\"csharp keyword\">void<\/code> <code class=\"csharp plain\">Register()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">var<\/code> <code class=\"csharp plain\">thisAssembly = <\/code><code class=\"csharp keyword\">typeof<\/code><code class=\"csharp plain\">(SwaggerConfig).Assembly;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">GlobalConfiguration.Configuration <\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">.EnableSwagger(c =&gt;<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">c.SingleApiVersion(<\/code><code class=\"csharp string\">\"v1\"<\/code><code class=\"csharp plain\">, <\/code><code class=\"csharp string\">\"Swagger Sample\"<\/code><code class=\"csharp plain\">);<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">c.IncludeXmlComments(GetXmlCommentsPath());<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">})<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">.EnableSwaggerUi(c =&gt;<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">});<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">protected<\/code> <code class=\"csharp keyword\">static<\/code> <code class=\"csharp keyword\">string<\/code> <code class=\"csharp plain\">GetXmlCommentsPath()<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">return<\/code> <code class=\"csharp plain\">System.String.Format(<\/code><code class=\"csharp string\">@\"{0}\\bin\\Swagger.XML\"<\/code><code class=\"csharp plain\">, System.AppDomain.CurrentDomain.BaseDirectory);<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"csharp plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Para o exemplo de nossa documenta\u00e7\u00e3o criei um simples <strong>Controller<\/strong> chamado <strong>Account<\/strong> e uma \u00fanica rota chamada <strong>Register<\/strong><\/p>\n<div>\n<div id=\"highlighter_450500\" class=\"syntaxhighlighter csharp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">namespace<\/code> <code class=\"csharp plain\">Swagger.Controllers<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">[RoutePrefix(<\/code><code class=\"csharp string\">\"api\/Account\"<\/code><code class=\"csharp plain\">)]<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">class<\/code> <code class=\"csharp plain\">AccountController : ApiController<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ &lt;summary&gt;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ Register a new user on application<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ &lt;\/summary&gt;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ &lt;param name=\"user\"&gt;New user to register&lt;\/param&gt;<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ &lt;remarks&gt;Adds new user to application and grant access&lt;\/remarks&gt;<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ &lt;response code=\"400\"&gt;Bad Request&lt;\/response&gt;<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp color1\">\/\/\/ &lt;response code=\"500\"&gt;Internal Server Error&lt;\/response&gt;<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">[AllowAnonymous]<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">[Route(<\/code><code class=\"csharp string\">\"Register\"<\/code><code class=\"csharp plain\">)]<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">[ResponseType(<\/code><code class=\"csharp keyword\">typeof<\/code><code class=\"csharp plain\">(RegisterBindingModel))]<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">[HttpPost]<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">async<\/code> <code class=\"csharp plain\">Task&lt;IHttpActionResult&gt; Register(RegisterBindingModel user)<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/IMPLEMENTATION OF CODE GOES HERE!!<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">throw<\/code> <code class=\"csharp keyword\">new<\/code> <code class=\"csharp plain\">NotImplementedException();<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"csharp plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Veja agora o resultado quando executamos nossa aplica\u00e7\u00e3o<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13418\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_04.png\" alt=\"\" width=\"1024\" height=\"795\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_04.png 1024w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_04-300x233.png 300w, https:\/\/gianfratti.com\/wp-content\/uploads\/2018\/12\/swagger_04-768x596.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Como podemos ver, o <strong>Swagger<\/strong> detalhou todo o nossa rota e colocou em sua interface gr\u00e1fica assim podemos saber para que serve, como\u00a0fazer a requisi\u00e7\u00e3o\u00a0e quais par\u00e2metros devemos passar.<\/p>\n<p>Com o <strong>Swagger<\/strong> podemos n\u00e3o somente detalhar melhor nossas API como tamb\u00e9m podemos customizar toda a interface, alterando cores, fontes, css e etc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje meu post ir\u00e1 falar sobre como podemos documentar nossas API REST. Documentar nunca foi e nunca ser\u00e1 uma tarefa das mais legais geralmente \u00e9 mon\u00f3tono, cansativo e trabalhoso. Documenta\u00e7\u00e3o tende-se a se perder a longo do tempo e facilmente ficar desatualizado.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[244,243],"class_list":["post-13413","post","type-post","status-publish","format-standard","hentry","category-net-framework","tag-documentacao","tag-swagger"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/13413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=13413"}],"version-history":[{"count":7,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/13413\/revisions"}],"predecessor-version":[{"id":13425,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/13413\/revisions\/13425"}],"wp:attachment":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=13413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=13413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=13413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}