{"id":45,"date":"2023-09-24T11:27:21","date_gmt":"2023-09-24T14:27:21","guid":{"rendered":"https:\/\/dotnetdicas.com.br\/?p=45"},"modified":"2023-12-10T13:02:06","modified_gmt":"2023-12-10T16:02:06","slug":"domine-o-controle-de-versao-em-apis-net","status":"publish","type":"post","link":"https:\/\/dotnetdicas.com.br\/?p=45","title":{"rendered":"Domine o Controle de Vers\u00e3o em APIs .Net"},"content":{"rendered":"<p><span style=\"font-family: verdana, geneva, sans-serif;\">Ol\u00e1, Devs! Vamos entender controle de vers\u00e3o no .Net?<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Em um mundo dominado por sistemas interconectados e aplica\u00e7\u00f5es que constantemente comunicam entre si, a gest\u00e3o e evolu\u00e7\u00e3o das interfaces de programa\u00e7\u00e3o de aplica\u00e7\u00f5es (APIs) \u00e9 crucial, especialmente quando se refere \u00e0 API do .Net. Em ambientes de desenvolvimento modernos, o controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes que a utilizam.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">1. Import\u00e2ncia do controle de vers\u00e3o<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Os desenvolvedores geralmente evoluem uma API primeiramente porque querem introduzir novas funcionalidades ou por outro lado, melhorar sua performance. No entanto, se eles n\u00e3o gerenciarem as altera\u00e7\u00f5es corretamente, incompatibilidades podem surgir e consequentemente prejudicar sistemas em produ\u00e7\u00e3o. Dessa forma, no contexto da API do .Net, precisamos de um mecanismo eficiente de controle de vers\u00e3o.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">2. M\u00e9todos tradicionais e seus desafios<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Tradicionalmente, desenvolvedores implementam o controle de vers\u00e3o em APIs atrav\u00e9s do versionamento por URL ou usando cabe\u00e7alhos HTTP. No primeiro m\u00e9todo, eles especificam a vers\u00e3o diretamente na URL da API, como em: <strong>api\/v1\/recurso<\/strong>. No segundo, eles indicam a vers\u00e3o em um cabe\u00e7alho HTTP, como <strong>Accept-Version: v1.0<\/strong>.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Por\u00e9m, desenvolvedores enfrentam desafios frequentemente. Quando eles incorporam a vers\u00e3o da API \u00e0 URL, mudan\u00e7as na estrutura da API podem resultar em URLs desorganizadas. J\u00e1 o uso de cabe\u00e7alhos pode confundir desenvolvedores menos experientes.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">3. Solu\u00e7\u00f5es que o .Net oferece<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Na API do .Net, os desenvolvedores encontram mecanismos refinados para controlar as vers\u00f5es. O .Net introduziu uma biblioteca espec\u00edfica, a <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Mvc.Versioning\/\" target=\"_blank\" rel=\"noopener\"><strong>Microsoft.AspNetCore.Mvc.Versioning<\/strong><\/a>, para simplificar esse processo.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Ao usar essa biblioteca, os desenvolvedores podem especificar a vers\u00e3o da API atrav\u00e9s de um par\u00e2metro de consulta, um cabe\u00e7alho personalizado ou diretamente no caminho da URL. Por exemplo, eles podem fazer uma solicita\u00e7\u00e3o assim: <strong>api\/recurso?api-version=2.0<\/strong>.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Essa abordagem oferece vantagens not\u00e1veis. Primeiramente, ela estabelece um padr\u00e3o uniforme, tornando o versionamento transparente e consistente. Al\u00e9m disso, com essa biblioteca, diferentes vers\u00f5es da API podem coexistir no mesmo endere\u00e7o, facilitando uma transi\u00e7\u00e3o suave entre elas.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">4. Vamos ver um exemplo?<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Considere o desenvolvimento de uma API que gerencia informa\u00e7\u00f5es de estudantes. Na primeira vers\u00e3o, tem-se um m\u00e9todo para obter o nome do estudante. Com o tempo, surge a necessidade de expandir essa funcionalidade, adicionando um m\u00e9todo para obter a m\u00e9dia de notas do estudante.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Sem o controle adequado de vers\u00e3o, essa nova funcionalidade poderia comprometer sistemas que dependem da vers\u00e3o anterior da API. No entanto, com o uso da biblioteca <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Mvc.Versioning\/\" target=\"_blank\" rel=\"noopener\"><strong>Microsoft.AspNetCore.Mvc.Versioning<\/strong><\/a>, \u00e9 poss\u00edvel manter ambas as vers\u00f5es funcionando simultaneamente.<\/span><\/p>\n<h4><span style=\"font-family: verdana, geneva, sans-serif;\">Como fa\u00e7o?<\/span><\/h4>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\"><strong>\u2713<\/strong> Primeiramente, voc\u00ea ter\u00e1 que adicionar a biblioteca <em>Microsoft.AspNetCore.Mvc.Versioning<\/em> ao projeto. Isso pode ser feito via <em>NuGet Package Manager<\/em> ou via linha de comando:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-50\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning-300x20.png\" alt=\"Instala\u00e7\u00e3o do pacote\" width=\"735\" height=\"49\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning-300x20.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning-1024x68.png 1024w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning-768x51.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning.png 1200w\" sizes=\"(max-width: 735px) 100vw, 735px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\"><strong>\u2713<\/strong> Depois de adicionada, configure o servi\u00e7o:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-55\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-config-300x105.png\" alt=\"Configura\u00e7\u00e3o do servi\u00e7o\" width=\"734\" height=\"257\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-config-300x105.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-config-1024x359.png 1024w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-config-768x269.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-config.png 1200w\" sizes=\"(max-width: 734px) 100vw, 734px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Aqui, configuramos a API para ter uma vers\u00e3o padr\u00e3o de <strong>1.0<\/strong>. Se nenhuma vers\u00e3o for especificada na solicita\u00e7\u00e3o, ela assumir\u00e1 <strong>1.0<\/strong> como padr\u00e3o. A op\u00e7\u00e3o <strong>ReportApiVersions<\/strong> informar\u00e1 aos clientes quais vers\u00f5es est\u00e3o dispon\u00edveis.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\"><strong>\u2713<\/strong> Crie a Controller de estudantes<\/span><\/p>\n<ul>\n<li><span style=\"font-family: verdana, geneva, sans-serif;\">Para vers\u00e3o 1 da API:<\/span><\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-57\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-300x120.png\" alt=\"Vers\u00e3o 1.0\" width=\"733\" height=\"293\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-300x120.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-1024x410.png 1024w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-768x307.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1.png 1200w\" sizes=\"(max-width: 733px) 100vw, 733px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">No exemplo acima, uma requisi\u00e7\u00e3o GET para <code>\/api\/students\/1\/name?api-version=1.0<\/code> retornar\u00e1 &#8220;Estudante 1: Jo\u00e3o Silva&#8221;.<\/span><\/p>\n<ul>\n<li><span style=\"font-family: verdana, geneva, sans-serif;\">Para vers\u00e3o 2 da API:<\/span><\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-61\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller2-300x120.png\" alt=\"Vers\u00e3o 2.0\" width=\"733\" height=\"293\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller2-300x120.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller2-1024x410.png 1024w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller2-768x307.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller2.png 1200w\" sizes=\"(max-width: 733px) 100vw, 733px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Agora, uma requisi\u00e7\u00e3o GET para <code>\/api\/students\/1\/averageGrade?api-version=2.0<\/code> retornar\u00e1 &#8220;Estudante 1: M\u00e9dia 8.5&#8221;.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"font-family: verdana, geneva, sans-serif;\">Posso fazer de outras formas?<\/span><\/h4>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Sim, voc\u00ea pode decorar a Controller com v\u00e1rias vers\u00f5es de API usando a anota\u00e7\u00e3o\u00a0 <strong>[ApiVersion]<\/strong><\/span><span style=\"font-family: verdana, geneva, sans-serif;\"><span style=\"font-family: verdana, geneva, sans-serif;\"> v\u00e1rias vezes. Isso significa que a controller (ou a a\u00e7\u00e3o, dependendo de onde voc\u00ea coloca a anota\u00e7\u00e3o) pode atender a m\u00faltiplas vers\u00f5es da API.<\/span><\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Se voc\u00ea quiser que o m\u00e9todo <strong>GetStudentName<\/strong> esteja dispon\u00edvel em ambas as vers\u00f5es &#8220;1.0&#8221; e &#8220;2.0&#8221;, voc\u00ea pode fazer o seguinte:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-64\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-300x120.png\" alt=\"Vers\u00f5es 1.0 e 2.0\" width=\"736\" height=\"294\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-300x120.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-1024x410.png 1024w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-768x307.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2.png 1200w\" sizes=\"(max-width: 736px) 100vw, 736px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Neste exemplo, o m\u00e9todo <strong>GetStudentName<\/strong> estar\u00e1 dispon\u00edvel para ambas <strong>api-version=1.0<\/strong> e <strong>api-version=2.0<\/strong> .<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Se voc\u00ea quiser ser ainda mais granular e especificar vers\u00f5es em n\u00edvel de a\u00e7\u00e3o (em vez da controller), voc\u00ea pode fazer isso tamb\u00e9m. Por exemplo, voc\u00ea pode ter um m\u00e9todo na controller que \u00e9 espec\u00edfico para uma vers\u00e3o e outro m\u00e9todo para outra vers\u00e3o:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-68\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-300x177.png\" alt=\"Vers\u00e3o para a\u00e7\u00e3o\" width=\"734\" height=\"433\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-300x177.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-1024x604.png 1024w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-768x453.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action.png 1200w\" sizes=\"(max-width: 734px) 100vw, 734px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif; font-size: 12pt;\">Neste cen\u00e1rio, o comportamento de <strong>GetStudentName<\/strong> pode variar dependendo da vers\u00e3o da API solicitada pelo cliente.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\"><br \/>\nExiste tamb\u00e9m, a anota\u00e7\u00e3o <strong>[MapToApiVersion]<\/strong> que \u00e9 usada para indicar explicitamente que uma a\u00e7\u00e3o espec\u00edfica em uma controller deve responder apenas a uma determinada vers\u00e3o da API, mesmo se o controlador em si estiver decorado para atender a v\u00e1rias vers\u00f5es.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Vamos ver como isso se aplica no contexto do nosso exemplo anterior:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-70\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-map-300x184.png\" alt=\"MapToApiVersion\" width=\"733\" height=\"450\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-map-300x184.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/versioning-controller1-2-action-map-768x470.png 768w\" sizes=\"(max-width: 733px) 100vw, 733px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Neste exemplo, a a\u00e7\u00e3o <strong>GetVersionSpecificInfo<\/strong> s\u00f3 responder\u00e1 \u00e0s solicita\u00e7\u00f5es que especificam <strong>api-version=2.0<\/strong>,\u00a0 gra\u00e7as \u00e0 anota\u00e7\u00e3o <strong>[MapToApiVersion(&#8220;2.0&#8221;)]<\/strong>. No\u00a0 entanto, o m\u00e9todo <strong>GetStudentName<\/strong> ainda est\u00e1 dispon\u00edvel para ambas as vers\u00f5es &#8220;1.0&#8221; e &#8220;2.0&#8221;, j\u00e1 que ele n\u00e3o possui uma anota\u00e7\u00e3o <strong>MapToApiVersion<\/strong> e a controller em si suporta ambas as vers\u00f5es.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">A anota\u00e7\u00e3o <strong>[MapToApiVersion]<\/strong> fornece uma granularidade adicional, permitindo que os desenvolvedores definam comportamentos espec\u00edficos para vers\u00f5es diferentes dentro da mesma controller.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">5. Conclus\u00e3o<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">O uso do versionamento, inicialmente, permite a coexist\u00eancia dessas duas vers\u00f5es da API no mesmo endere\u00e7o. Dessa forma, sistemas legados continuem a funcionar normalmente, enquanto novos sistemas ou sistemas atualizados podem optar por utilizar a vers\u00e3o mais recente da API.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Isso ilustra o poder e a flexibilidade do controle de vers\u00e3o na API do .NET, permitindo que os desenvolvedores evoluam suas APIs sem medo de quebrar sistemas existentes.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Legal n\u00e9?!<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1, Devs! Vamos entender controle de vers\u00e3o no .Net? Em um mundo dominado por sistemas interconectados e aplica\u00e7\u00f5es que constantemente comunicam entre si, a gest\u00e3o e evolu\u00e7\u00e3o das interfaces de programa\u00e7\u00e3o de aplica\u00e7\u00f5es (APIs) \u00e9 crucial, especialmente quando se refere \u00e0 API do .Net. Em ambientes de desenvolvimento modernos, o controle de vers\u00e3o desempenha um [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Domine o Controle de Vers\u00e3o em APIs .Net - DotNetDicas - C\u00f3digo forte, Carreira mais forte<\/title>\n<meta name=\"description\" content=\"O controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dotnetdicas.com.br\/?p=45\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Domine o Controle de Vers\u00e3o em APIs .Net - DotNetDicas - C\u00f3digo forte, Carreira mais forte\" \/>\n<meta property=\"og:description\" content=\"O controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dotnetdicas.com.br\/?p=45\" \/>\n<meta property=\"og:site_name\" content=\"DotNetDicas - C\u00f3digo forte, Carreira mais forte\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-24T14:27:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-10T16:02:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning-300x20.png\" \/>\n<meta name=\"author\" content=\"L\u00facio Torres\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"L\u00facio Torres\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dotnetdicas.com.br\/?p=45\",\"url\":\"https:\/\/dotnetdicas.com.br\/?p=45\",\"name\":\"Domine o Controle de Vers\u00e3o em APIs .Net - DotNetDicas - C\u00f3digo forte, Carreira mais forte\",\"isPartOf\":{\"@id\":\"https:\/\/dotnetdicas.com.br\/#website\"},\"datePublished\":\"2023-09-24T14:27:21+00:00\",\"dateModified\":\"2023-12-10T16:02:06+00:00\",\"author\":{\"@id\":\"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa\"},\"description\":\"O controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes...\",\"breadcrumb\":{\"@id\":\"https:\/\/dotnetdicas.com.br\/?p=45#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dotnetdicas.com.br\/?p=45\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/dotnetdicas.com.br\/?p=45#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/dotnetdicas.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Domine o Controle de Vers\u00e3o em APIs .Net\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/dotnetdicas.com.br\/#website\",\"url\":\"https:\/\/dotnetdicas.com.br\/\",\"name\":\"DotNetDicas - C\u00f3digo forte, Carreira mais forte\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/dotnetdicas.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa\",\"name\":\"L\u00facio Torres\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g\",\"caption\":\"L\u00facio Torres\"},\"sameAs\":[\"https:\/\/dotnetdicas.com.br\"],\"url\":\"https:\/\/dotnetdicas.com.br\/?author=2\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Domine o Controle de Vers\u00e3o em APIs .Net - DotNetDicas - C\u00f3digo forte, Carreira mais forte","description":"O controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dotnetdicas.com.br\/?p=45","og_locale":"pt_BR","og_type":"article","og_title":"Domine o Controle de Vers\u00e3o em APIs .Net - DotNetDicas - C\u00f3digo forte, Carreira mais forte","og_description":"O controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes...","og_url":"https:\/\/dotnetdicas.com.br\/?p=45","og_site_name":"DotNetDicas - C\u00f3digo forte, Carreira mais forte","article_published_time":"2023-09-24T14:27:21+00:00","article_modified_time":"2023-12-10T16:02:06+00:00","og_image":[{"url":"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/09\/pkgversiooning-300x20.png"}],"author":"L\u00facio Torres","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"L\u00facio Torres","Est. tempo de leitura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dotnetdicas.com.br\/?p=45","url":"https:\/\/dotnetdicas.com.br\/?p=45","name":"Domine o Controle de Vers\u00e3o em APIs .Net - DotNetDicas - C\u00f3digo forte, Carreira mais forte","isPartOf":{"@id":"https:\/\/dotnetdicas.com.br\/#website"},"datePublished":"2023-09-24T14:27:21+00:00","dateModified":"2023-12-10T16:02:06+00:00","author":{"@id":"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa"},"description":"O controle de vers\u00e3o desempenha um papel essencial, garantindo que as modifica\u00e7\u00f5es feitas na API n\u00e3o comprometam as aplica\u00e7\u00f5es existentes...","breadcrumb":{"@id":"https:\/\/dotnetdicas.com.br\/?p=45#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dotnetdicas.com.br\/?p=45"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dotnetdicas.com.br\/?p=45#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/dotnetdicas.com.br\/"},{"@type":"ListItem","position":2,"name":"Domine o Controle de Vers\u00e3o em APIs .Net"}]},{"@type":"WebSite","@id":"https:\/\/dotnetdicas.com.br\/#website","url":"https:\/\/dotnetdicas.com.br\/","name":"DotNetDicas - C\u00f3digo forte, Carreira mais forte","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dotnetdicas.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa","name":"L\u00facio Torres","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g","caption":"L\u00facio Torres"},"sameAs":["https:\/\/dotnetdicas.com.br"],"url":"https:\/\/dotnetdicas.com.br\/?author=2"}]}},"_links":{"self":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts\/45"}],"collection":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=45"}],"version-history":[{"count":25,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts\/45\/revisions"}],"predecessor-version":[{"id":153,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts\/45\/revisions\/153"}],"wp:attachment":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=45"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=45"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=45"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}