{"id":1941,"date":"2021-06-07T00:15:33","date_gmt":"2021-06-07T03:15:33","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=1941"},"modified":"2024-01-11T18:02:49","modified_gmt":"2024-01-11T21:02:49","slug":"fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/","title":{"rendered":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0"},"content":{"rendered":"APIs tem import\u00e2ncia crescente no <em>design<\/em> de aplica\u00e7\u00f5es. Boas APIs facilitam o estabelecimento de parcerias, permitindo que sistemas se comuniquem de maneira s\u00f3lida, facilitando a automa\u00e7\u00e3o dos neg\u00f3cios.\n<hr \/>\nO projeto de APIs, em consequ\u00eancia dessa import\u00e2ncia, \u00e9 atividade fundamental de arquitetura. A cria\u00e7\u00e3o de APIs intuitivas e f\u00e1ceis \u00e9 essencial. \u00c9 essencial que o arquiteto respons\u00e1vel garanta a sele\u00e7\u00e3o do estilo mais adaptado as necessidades.\n<hr \/>\nDesde o in\u00edcio dos anos 2000, vem ganhando destaque APIs projetadas conforme o estilo arquitetural REST, embora, infelizmente, as implementa\u00e7\u00f5es n\u00e3o sejam, muitas vezes, &#8220;fi\u00e9is&#8221; aos princ\u00edpios estabelecidos nesse estilo.\n<h2>Conceito fundamental<\/h2>\nCom frequ\u00eancia, APIs que utilizam verbos padr\u00f5es HTTP &#8211; GET, PUT, POST e DELETE &#8211; e entregam conte\u00fado em XML ou JSON s\u00e3o designadas como RESTful. Entretanto, estas caracter\u00edsticas n\u00e3o s\u00e3o suficientes para tal designa\u00e7\u00e3o.\n<hr \/>\n<p><strong>REST, acr\u00f4nimo para <em>Representational State Transfer,<\/em>\u00a0\u00e9 um estilo arquitetural para sistemas hiperm\u00eddia distribu\u00eddos<\/strong>. Ele foi introduzido e definido, no ano 2000, por <a title=\"\" href=\"https:\/\/pt.wikipedia.org\/wiki\/Roy_Fielding\">Roy Fielding<\/a>, em sua tese de doutorado. <strong>Trata-se de um conjunto de restri\u00e7\u00f5es arquiteturais aplicados a <em>World Wide Web<\/em>. <\/strong><\/p>\n<p><strong>Apenas sistemas desenvolvidos observando corretamente o estilo REST podem ser identificados como <em>RESTful<\/em>.\u00a0<\/strong><\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Null Style<\/p>\r\n<\/p>\n<p>Em sua tese, Roy Fielding, defende a exist\u00eancia de duas abordagens para a elabora\u00e7\u00e3o de um\u00a0<em>design<\/em>\u00a0arquitetural.<\/p>\n<p>A primeira abordagem\u00a0\u00e9 aquela onde um projeto de sistema come\u00e7a &#8220;do zero&#8221; &#8211; como que em\u00a0uma &#8220;tela em branco&#8221; &#8211; e vai sendo elaborado utilizando elementos familiares at\u00e9 que, em dado momento, satisfa\u00e7a as necessidades pretendidas.<\/p>\n<p>A segunda abordagem parte de um sistema &#8220;pronto&#8221;, com todos os elementos demandados para atender uma determinada necessidade j\u00e1 presentes, por\u00e9m sem restri\u00e7\u00f5es. Ent\u00e3o, restri\u00e7\u00f5es s\u00e3o aplicadas para &#8220;aparar&#8221; os elementos do sistema at\u00e9 que ele satisfa\u00e7a apenas a um conjunto de especifica\u00e7\u00f5es bem determinado. Este &#8220;ponto de partida&#8221;, sem restri\u00e7\u00f5es, \u00e9 designado por Roy Fielding como\u00a0<em>Null Style.<\/em><\/p>\n<p><strong>REST, como estilo arquitetural, tem como <em>Null Style <\/em>a\u00a0<em>World Wide Web.<\/em><\/strong><\/p>\n<p><\/div>\nSistemas <em>RESTful<\/em> destacam-se por terem atributos de qualidade como portabilidade, escalabilidade, visibilidade (facilidade para monitoramento), confiabilidade e desempenho percebido (responsividade). Al\u00e9m disso, tem \u00f3timo <em>evolvability<\/em>.\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">World Wide Web<\/p>\r\n<\/p>\n<p>A <em>World Wide Web (WWW)\u00a0<\/em>\u00e9 um sistema de informa\u00e7\u00e3o onde documentos e outros recursos s\u00e3o identificados por\u00a0<em>Uniform Resource Locators<\/em> (URLs, como https:\/\/example.com\/), interlig\u00e1veis por hiperlinks, acess\u00edveis \u200b\u200bpela Internet.<\/p>\n<p>Os recursos da <em>Web<\/em> s\u00e3o transferidos por meio de implementa\u00e7\u00f5es de protocolos, como HTTP, e podem ser acessados \u200b\u200bpelos usu\u00e1rios por aplicativos navegadores \u00a0e publicados por um aplicativos servidores.<\/p>\n<p>O cientista ingl\u00eas <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Tim_Berners-Lee\">Sir Timothy Berners-Lee<\/a> inventou a <em>World Wide Web<\/em> em 1989. Ele escreveu o primeiro navegador da web em 1990 enquanto trabalhava no <em>CERN<\/em>\u00a0(<em>European Organization for Nuclear Research<\/em>) perto de Genebra, Su\u00ed\u00e7a. O navegador foi lan\u00e7ado fora do <em>CERN<\/em> para outras institui\u00e7\u00f5es de pesquisa a partir de janeiro de 1991, e depois para o p\u00fablico em geral em agosto de 1991. A Web come\u00e7ou a entrar no uso di\u00e1rio em 1993-4, quando sites de uso geral come\u00e7aram a se tornar dispon\u00edveis.<\/p>\n<p><\/div>\n<h2>Definindo &#8220;recurso&#8221;<\/h2>\n<p>Para entender REST \u00e9 fundamental assimilar o conceito\u00a0de &#8220;recursos&#8221;. A RFC 2396, de 1998, define &#8220;recurso&#8221; como:<\/p>\n<p style=\"padding-left: 40px;\"><em>Um recurso pode ser qualquer coisa que tenha identidade. Os exemplos familiares incluem um documento eletr\u00f4nico, uma imagem, um servi\u00e7o (por exemplo, &#8220;previs\u00e3o do tempo de hoje para Los Angeles&#8221;) e uma cole\u00e7\u00e3o de outros recursos. Nem todos os recursos s\u00e3o &#8220;recuper\u00e1veis&#8221; pela rede; por exemplo, seres humanos, empresas e livros encadernados em uma biblioteca tamb\u00e9m podem ser considerados recursos. O recurso \u00e9 o mapeamento conceitual para uma entidade ou conjunto de entidades, n\u00e3o necessariamente a entidade que corresponde a esse mapeamento em qualquer inst\u00e2ncia espec\u00edfica no tempo. Assim, um recurso pode permanecer constante mesmo quando seu conte\u00fado &#8212; as entidades \u00e0s quais atualmente corresponde &#8212; muda ao longo do tempo, desde que o mapeamento conceitual n\u00e3o seja alterado no processo.<\/em><\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">URI e URL<\/p>\r\n<\/p>\n<p>URI, acr\u00f4nimo para <em>Uniform Resource Identificator,\u00a0<\/em>\u00e9 uma identifica\u00e7\u00e3o simples para um recurso. Enquanto isso, URL, acr\u00f4nimo para <em>Uniform Resource Locator<\/em>,\u00a0especifica tamb\u00e9m como este recurso deve ser acessado.<\/p>\n<p><strong>Todas URLs s\u00e3o URIs, mas nem toda URI \u00e9 uma URL.<\/strong><\/p>\n<p><\/div>\n<h2>Elementos arquiteturais para REST<\/h2>\n<p>O estilo arquitetural REST define abstra\u00e7\u00f5es para os elementos arquitet\u00f4nicos em um sistema hiperm\u00eddia distribu\u00eddo, enquanto ignora os detalhes de implementa\u00e7\u00e3o.<\/p>\n<p>Sistemas <em>RESTful <\/em>geralmente ser\u00e3o compostos por componentes, conectores que ligam esses componentes e os dados que eles utilizam.<\/p>\n<h4>Elementos arquiteturais relacionados com &#8220;Dados&#8221;<\/h4>\n<p><strong>Sistemas <em>RESTful\u00a0<\/em>se caracterizam pela movimenta\u00e7\u00e3o dos dados atrav\u00e9s de componentes de processamento, em oposi\u00e7\u00e3o a outros estilos onde os diversos componentes operam sobre uma \u00fanica &#8220;fonte da verdade&#8221;.<\/strong> Essa caracter\u00edstica, refor\u00e7a a coes\u00e3o, eventualmente comprometendo a efici\u00eancia.<\/p>\n<p>Ao projetar dados, um componente &#8220;servidor&#8221; pode-se adotar uma das seguintes tr\u00eas estrat\u00e9gias:<\/p>\n<ol>\n<li>renderizar os dados para uma representa\u00e7\u00e3o espec\u00edfica;<\/li>\n<li>enviar os dados em sua representa\u00e7\u00e3o nativa, acompanhados de c\u00f3digo que realiza a renderiza\u00e7\u00e3o para uma representa\u00e7\u00e3o espec\u00edfica;<\/li>\n<li>enviar os dados em sua representa\u00e7\u00e3o nativa, acompanhados de metadados para que o componente &#8220;cliente&#8221; adote uma estrat\u00e9gia de processamento;<\/li>\n<\/ol>\n<hr \/>\n<p>S\u00e3o elementos arquiteturais relacionados com dados:<\/p>\n<ul>\n<li>recurso;<\/li>\n<li>identificador, geralmente uma URI ou URN;<\/li>\n<li>representa\u00e7\u00f5es, como HTML, JSON e XML;<\/li>\n<li>metadados da representa\u00e7\u00e3o, como cabe\u00e7alhos como\u00a0<em>media-type\u00a0<\/em>e\u00a0<em>last-modified<\/em><\/li>\n<li>metadados do recurso, com cabe\u00e7alhos como\u00a0<em>alternates\u00a0<\/em>e\u00a0<em>vary<\/em><\/li>\n<li>metadados de controle, com cabe\u00e7alhos como\u00a0<em>if-modified-since\u00a0<\/em>e\u00a0<em>cache-control<\/em><\/li>\n<\/ul>\n<hr \/>\n<h4>Elementos arquiteturais &#8220;Conectores&#8221;<\/h4>\n<p><strong>Os conectores s\u00e3o as tecnologias respons\u00e1veis por acessar e transportar os dados entre dois ou mais componentes.<\/strong> Basicamente, eles podem ser agrupados em tecnologias clientes, servidoras, para\u00a0<em>caching<\/em>, transporte (<em>tunnel<\/em>) e\u00a0<i>resolver\u00a0<\/i>(ex: servidores DNS).<\/p>\n<p>Os principais tipos de conectores s\u00e3o &#8220;cliente&#8221; e &#8220;servidor&#8221;. A diferen\u00e7a essencial entre os dois \u00e9 que um cliente inicia a comunica\u00e7\u00e3o fazendo uma requisi\u00e7\u00e30, enquanto um servidor escuta as conex\u00f5es e responde \u00e0s requisi\u00e7\u00f5es para fornecer acesso aos seus servi\u00e7os. Eventualmente, um mesmo componente pode incluir conectores de cliente e de servidor.<\/p>\n<p>Um terceiro tipo de conector, o conector de <em>&#8220;caching&#8221;,<\/em> pode ficar localizado pr\u00f3ximo do &#8220;cliente&#8221; ou ou do &#8220;servidor&#8221; a fim de salvar respostas armazen\u00e1veis em cache para intera\u00e7\u00f5es atuais para que possam ser reutilizadas para intera\u00e7\u00f5es posteriores. Um cache pode ser usado por um cliente para evitar a repeti\u00e7\u00e3o da comunica\u00e7\u00e3o da rede, ou por um servidor para evitar a repeti\u00e7\u00e3o do processo de gera\u00e7\u00e3o de uma resposta, com ambos os casos servindo para reduzir a lat\u00eancia de intera\u00e7\u00e3o.<\/p>\n<h4>Elementos arquiteturais &#8220;Componentes&#8221;<\/h4>\n<p><strong>Os componentes s\u00e3o elementos de processamento que se conectam a outros por meio de conectores.<\/strong> Os componentes mais comuns s\u00e3o o &#8220;cliente&#8221; e o &#8220;servidor&#8221;. Em um modelo em camadas, um mesmo componente pode ser, ao mesmo tempo, &#8220;cliente&#8221; e &#8220;servidor&#8221; realizando algum tipo de transforma\u00e7\u00e3o ou seguran\u00e7a.<\/p>\n<h2>Sistemas RESTful s\u00e3o &#8220;cliente-servidor&#8221;<\/h2>\n<p><strong>A primeira restri\u00e7\u00e3o definida for\u00a0Fielding \u00e9 que sistemas que seguem o estilo arquitetural REST sejam implementa\u00e7\u00f5es cliente-servidor.<\/strong> Cabe ao componente &#8220;cliente&#8221; disponibilizar interfaces com o usu\u00e1rio. Enquanto isso, componentes &#8220;servidor&#8221; fornecem dados. Em sistemas RESTful, eventualmente, um mesmo componente de software poder\u00e1 operar como cliente e servidor.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\" wp-image-1988 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-server.png\" alt=\"\" width=\"533\" height=\"118\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-server.png 706w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-server-300x66.png 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/><\/p>\n<p>Um software navegador utilizado para navegar na internet atua como cliente. Afinal, envia requisi\u00e7\u00f5es HTTP, para um servidor, de forma a acessar e manipular dados.<\/p>\n<p>A separa\u00e7\u00e3o de responsabilidades, segundo Fielding, refor\u00e7a atributos de qualidade como portabilidade &#8211; permitindo que implementa\u00e7\u00f5es &#8220;cliente&#8221; independentes sejam realizadas em diversas plataformas &#8211; e a escalabilidade &#8211; simplificando os componentes &#8220;servidor&#8221;. Al\u00e9m disso, por habilitar que &#8220;cliente&#8221; e &#8220;servidor&#8221; evoluam de forma independente, colaboram para o\u00a0<em>evolvability.<\/em><\/p>\n<h2>Componentes &#8220;servidor&#8221; s\u00e3o\u00a0<em>stateless<\/em><\/h2>\n<p><strong>A segunda restri\u00e7\u00e3o definida por Fielding \u00e9 que sistemas <em>RESTful<\/em> sejam\u00a0<\/strong><em><strong>stateless.<\/strong>\u00a0<\/em>Ou seja, cada requisi\u00e7\u00e3o de componentes &#8220;cliente&#8221; \u00a0deve conter todas as informa\u00e7\u00f5es contextuais necess\u00e1rias para serem atendidas, sem depender de qualquer dado de contexto armazenado no componente &#8220;servidor&#8221;.<strong> Assim, informa\u00e7\u00f5es de sess\u00e3o devem ser mantidas, inteiramente, apenas no componente &#8220;cliente&#8221;<\/strong>.<\/p>\n<p><img decoding=\"async\" class=\"wp-image-1989 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-stateless-server.png\" alt=\"\" width=\"533\" height=\"405\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-stateless-server.png 706w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-stateless-server-300x228.png 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/><\/p>\n<p><strong>Por serem\u00a0<em>stateless,\u00a0<\/em>sistemas <em>RESTful<\/em>\u00a0t\u00eam melhor visibilidade, confiabilidade e escalabilidade<\/strong>. Afinal:<\/p>\n<ul>\n<li>cada solicita\u00e7\u00e3o pode ser verificada, completamente, de maneira isolada, j\u00e1 que contem todos os dados necess\u00e1rios para a an\u00e1lise<em>;<\/em><\/li>\n<li>por n\u00e3o manterem estado de contexto, \u00e9 mais f\u00e1cil recuperar o &#8220;lado servidor&#8221; de falhas parciais;<\/li>\n<li>por n\u00e3o haver necessidade de manter estado de contexto, sistemas <em>RESTful<\/em> s\u00e3o mais f\u00e1ceis de implementar e de escalar.<\/li>\n<\/ul>\n<hr \/>\n<p>Como pontos potencialmente negativos, a restri\u00e7\u00e3o de que componentes &#8220;servidor&#8221; sejam <em>stateless<\/em> implica em tr\u00e1fego de dados maior na rede, pelo transporte da informa\u00e7\u00e3o de estado contexto. Al\u00e9m disso, h\u00e1 potencial excesso de autonomia dos componentes &#8220;cliente&#8221; (que operam sem supervis\u00e3o do servidor).<\/p>\n<h2>Recursos devem ser indicados como sendo &#8220;cache\u00e1veis&#8221; ou &#8220;n\u00e3o-cache\u00e1veis&#8221;<\/h2>\n<p><strong>A terceira restri\u00e7\u00e3o definida por Fielding \u00e9 que sistemas <em>RESTful<\/em>\u00a0devem indicar a possibilidade de ado\u00e7\u00e3o de\u00a0<i>caching\u00a0<\/i>nos componentes &#8220;cliente&#8221;.\u00a0<\/strong>Para isso, todas as respostas do componente &#8220;servidor&#8221; devem ser identificadas, impl\u00edcita ou explicitamente, como armazen\u00e1veis ou n\u00e3o armazen\u00e1veis em <em>cache<\/em>.<\/p>\n<p><img decoding=\"async\" class=\"wp-image-1990 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-cache-stateless-server.png\" alt=\"\" width=\"533\" height=\"405\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-cache-stateless-server.png 706w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/client-cache-stateless-server-300x228.png 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/><\/p>\n<p>A ado\u00e7\u00e3o de\u00a0<em>caching\u00a0<\/em>melhora a efici\u00eancia, colaborando para a escalabilidade e desempenho. Entretanto, dados armazenados em <em>cache<\/em> podem ficar desatualizados, antes de serem invalidados, comprometendo a confiabilidade.<\/p>\n<h2>Comunica\u00e7\u00f5es entre &#8220;cliente&#8221; e &#8220;servidor&#8221; devem ocorrer atrav\u00e9s de interface uniforme<\/h2>\n<p><strong>A quarta restri\u00e7\u00e3o definida por Fielding \u00e9 que as comunica\u00e7\u00f5es entre componentes &#8220;cliente&#8221; e &#8220;servidor&#8221;, em sistemas <em>RESTful,\u00a0<\/em>ocorram atrav\u00e9s de interfaces uniformes (consistentes).\u00a0<\/strong>Dessa forma, a implementa\u00e7\u00e3o dos componentes &#8220;cliente&#8221; e &#8220;servidor&#8221; podem ocorrer de forma desacoplada (e independente).<\/p>\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1992 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/uniform_comm.png\" alt=\"\" width=\"533\" height=\"405\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/uniform_comm.png 706w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/uniform_comm-300x228.png 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/><\/p>\n<p>H\u00e1 quatro restri\u00e7\u00f5es arquiteturais adicionais derivadas da decis\u00e3o de adotar interfaces uniformes:<\/p>\n<ol>\n<li><strong>Recursos devem ser identificados consistentemente<\/strong>. Na pr\u00e1tica, recursos em um sistema <em>RESTful\u00a0<\/em>devem estar associados a identifica\u00e7\u00f5es est\u00e1veis, ou seja, que n\u00e3o mudam durante as intera\u00e7\u00f5es, tampouco quando o estado interno do recurso (conjunto de dados que o comp\u00f5e) \u00e9 alterado.<\/li>\n<li><strong>Recursos devem ser manipulados a partir de representa\u00e7\u00f5es.\u00a0<\/strong>A representa\u00e7\u00e3o de um recurso \u00e9 composta por uma sequ\u00eancia de <em>bytes\u00a0<\/em>e metadados que a descrevem. Opcionalmente, uma representa\u00e7\u00e3o tamb\u00e9m cont\u00e9m metadados que descrevem o recurso em si. Em implementa\u00e7\u00f5es REST usando HTTP, por exemplo, entidades de dom\u00ednio s\u00e3o recursos que podem ser expostos em representa\u00e7\u00f5es usando XML, JSON e mais; enquanto isso, metadados descrevendo uma representa\u00e7\u00e3o s\u00e3o fornecidos no cabe\u00e7alho;<\/li>\n<li><strong>Mensagens devem ser\u00a0<\/strong><b>auto-descritivas.\u00a0<\/b>Ou seja, devem conter todas as informa\u00e7\u00f5es para que o receptor &#8211; cliente ou servidor &#8211; tenha condi\u00e7\u00f5es realizar interpreta\u00e7\u00e3o correta, sem necessitar de mensagens adicionais ou documenta\u00e7\u00e3o em separado.<\/li>\n<li><strong>Hiperm\u00eddia deve ser utilizada como mecanismo de estado (HATEOAS)<\/strong>. Utilizando hiperlinks e, possivelmente, modelos consistentes de URI, como parte dos metadados que descrevem o recurso, seja para descrever documentos ligados como ativa\u00e7\u00f5es de estado.<\/li>\n<\/ol>\n<hr \/>\n<h2>HATEOAS<\/h2>\n<p><i>Hypermedia as the Engine of Application State<\/i>, ou <i>HATEOAS<\/i>, \u00e9 uma \u201cmaneira\u201d de implementar APIs REST utilizando\u00a0<a href=\"https:\/\/pt.m.wikipedia.org\/wiki\/Hiperm%C3%ADdia\">hiperm\u00eddia<\/a>\u00a0para indicar que a\u00e7\u00f5es ou navega\u00e7\u00f5es est\u00e3o dispon\u00edveis para um determinado recurso. Estas\u00a0\u00a0a\u00e7\u00f5es e a navega\u00e7\u00e3o s\u00e3o derivadas do estado do recurso e, eventualmente, da pr\u00f3pria API. Elas s\u00e3o disponibilizadas para o cliente atrav\u00e9s de uma cole\u00e7\u00e3o de <i>links<\/i>.<\/p>\n<pre>{\r\n  \u201ccustormerId\u201d: 1, \r\n  \u201cfirstName\u201d: \u201cJohn\u201d, \r\n  \u201clastName\u201d: \u201cDoe\u201d, \r\n  ...\r\n  \r\n  links: []\r\n}\r\n<\/pre>\n<p>N\u00e3o h\u00e1 uma defini\u00e7\u00e3o universalmente aceita sobre onde esta cole\u00e7\u00e3o de <i>links<\/i>\u00a0deve ser fornecida. H\u00e1 quem defenda a inclus\u00e3o na representa\u00e7\u00e3o do recurso. Outros, defendem a utiliza\u00e7\u00e3o dos cabe\u00e7alhos da \u201c<i>response HTTP<\/i>\u201d.\u00a0Quanto aos dados necess\u00e1rios em cada <i>link,\u00a0<\/i><a href=\"https:\/\/tools.ietf.org\/html\/rfc5988\">h\u00e1 a RFC (5598)<\/a>.<\/p>\n<h4>O link para Self<\/h4>\n<p>O primeiro <i>link<\/i> da cole\u00e7\u00e3o deveria ser uma refer\u00eancia para o pr\u00f3prio objeto.<\/p>\n<pre>{\r\n  \u201ccustormerId\u201d: 1, \r\n  \u201cfirstName\u201d: \u201cJohn\u201d, \r\n  \u201clastName\u201d: \u201cDoe\u201d, \r\n  ...\r\n  \r\n  links: [{\r\n    \u201crel\u201d: \u201cself\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d \r\n  }]\r\n}\r\n<\/pre>\n<p>Dessa forma, caso a representa\u00e7\u00e3o do recurso \u201cpasseie\u201d pela aplica\u00e7\u00e3o cliente, ou, caso ela, eventualmente, seja persistida ou compartilhada com outros contextos, em qualquer momento, seria poss\u00edvel determinar sua origem sem \u201cinfer\u00eancias no c\u00f3digo\u201d.<\/p>\n<h4>Links para as a\u00e7\u00f5es suportadas pelo recurso<\/h4>\n<p>Imagine-se concebendo uma interface para o usu\u00e1rio. Nela, deve ser poss\u00edvel alterar os dados de um recurso ou solicitar sua exclus\u00e3o. Eventualmente, alguns recursos (um pedido, por exemplo) n\u00e3o podem ser alterados sob certas condi\u00e7\u00f5es. Ou ainda, n\u00e3o podem ser exclu\u00eddos. Como e onde a \u201cl\u00f3gica\u201d para determinar as a\u00e7\u00f5es poss\u00edveis deve ser implementada?<\/p>\n<pre>{\r\n  \u201ccustormerId\u201d: 1, \r\n  \u201cfirstName\u201d: \u201cJohn\u201d, \r\n  \u201clastName\u201d: \u201cDoe\u201d, \r\n  ...\r\n  \r\n  links: [{\r\n    \u201crel\u201d: \u201cself\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d \r\n  },{\r\n    \u201crel\u201d: \u201cupdate\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d\r\n  },{\r\n    \u201crel\u201d: \u201cdelete\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d\r\n  }]\r\n}\r\n<\/pre>\n<p>Fornecer a lista de a\u00e7\u00f5es poss\u00edveis para um recurso na cole\u00e7\u00e3o de <em>links<\/em> permite que essa l\u00f3gica seja implementada totalmente no servi\u00e7o e simplifica muito a implementa\u00e7\u00e3o da aplica\u00e7\u00e3o cliente. O bot\u00e3o \u201cexcluir\u201d, por exemplo, estaria dispon\u00edvel apenas se o <em>link<\/em> correspondente estivesse na cole\u00e7\u00e3o.<\/p>\n<p>Outra vantagem de retornar a lista de <em>links<\/em> com as a\u00e7\u00f5es dispon\u00edveis \u00e9 que a l\u00f3gica pode mudar no servidor, incluindo os endere\u00e7os, sem altera\u00e7\u00e3o alguma no c\u00f3digo da aplica\u00e7\u00e3o cliente.<\/p>\n<h4>Links para navega\u00e7\u00e3o<\/h4>\n<p>Eventualmente, um recurso retornado pela API possuir\u00e1 outros recursos relacionados. Por exemplo, em uma aplica\u00e7\u00e3o empresarial, um \u201ccliente\u201d possuir\u00e1 uma cole\u00e7\u00e3o de \u201cpedidos\u201d que realizou.<\/p>\n<pre>{\r\n  \u201ccustormerId\u201d: 1, \r\n  \u201cfirstName\u201d: \u201cJohn\u201d, \r\n  \u201clastName\u201d: \u201cDoe\u201d, \r\n  ...\r\n  \r\n  links: [{\r\n    \u201crel\u201d: \u201cself\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d\r\n  },{\r\n    \u201crel\u201d: \u201cupdate\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d\r\n  },{\r\n    \u201crel\u201d: \u201cdelete\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\u201d\r\n  },{\r\n    \u201crel\u201d: \u201corders\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/customers\/1\/orders\u201d\r\n  }]\r\n}\r\n<\/pre>\n<p>A presen\u00e7a desses <em>links<\/em> evita que a aplica\u00e7\u00e3o cliente precise fazer \u201cinfer\u00eancias\u201d sobre como \u201cchegar\u201d em recursos relacionados, diminuindo acoplamento. Essa a\u00e7\u00e3o autoriza, por exemplo, a mudan\u00e7a na estrat\u00e9gia de rotas sem afetar a aplica\u00e7\u00e3o cliente.<\/p>\n<pre>{\r\n  \u201ccustormerId\u201d: 1,\r\n  \u201cfirstName\u201d: \u201cJohn\u201d,\r\n  \u201clastName\u201d: \u201cDoe\u201d,\r\n  ...\r\n  links: [ ...,\r\n  {\r\n    \u201crel\u201d: \u201corders\u201d,\r\n    \u201chref\u201d: \u201chttp:\/\/mydomain\/orders?customerId=1\u201d ]\r\n   }]\r\n}\r\n<\/pre>\n<h2>N\u00e3o h\u00e1 restri\u00e7\u00f5es quanto a utilizar HTTP POST para atualiza\u00e7\u00f5es<\/h2>\n<p>Uma das &#8220;verdades absolutas&#8221; sobre REST, que n\u00e3o \u00e9 verdade, \u00e9 a ideia de que o verbo HTTP POST n\u00e3o pode ser utilizado para atualizar recursos. Ali\u00e1s, o pr\u00f3prio Roy Fielding \u00e9 bastante opinativo a este respeito.<\/p>\n<p style=\"padding-left: 40px;\"><em>A \u00fanica coisa que o REST exige dos m\u00e9todos \u00e9 que eles sejam definidos uniformemente para todos os recursos (ou seja, para que os intermedi\u00e1rios n\u00e3o precisem saber o tipo de recurso para entender o significado da solicita\u00e7\u00e3o). Enquanto o m\u00e9todo est\u00e1 sendo usado de acordo com sua pr\u00f3pria defini\u00e7\u00e3o, REST n\u00e3o tem muito a dizer sobre isso.<\/em><\/p>\n<p style=\"padding-left: 40px;\"><em>Por exemplo, n\u00e3o \u00e9 RESTful usar GET para executar opera\u00e7\u00f5es inseguras porque isso violaria a defini\u00e7\u00e3o do m\u00e9todo GET em HTTP, o que, por sua vez, enganaria intermedi\u00e1rios e spiders. N\u00e3o \u00e9 RESTful usar POST para recupera\u00e7\u00e3o de informa\u00e7\u00f5es quando essas informa\u00e7\u00f5es correspondem a um recurso potencial, porque esse uso impede a reutiliza\u00e7\u00e3o segura e o efeito de rede de ter um URI. Mas por que voc\u00ea n\u00e3o deve usar o POST para realizar uma atualiza\u00e7\u00e3o? O hipertexto pode informar ao cliente qual m\u00e9todo usar quando a a\u00e7\u00e3o executada n\u00e3o for segura. PUT \u00e9 necess\u00e1rio quando n\u00e3o h\u00e1 hipertexto dizendo ao cliente o que fazer, mas a falta de hipertexto n\u00e3o \u00e9 particularmente RESTful. (Roy Fielding)<\/em><\/p>\n<h2>Implementa\u00e7\u00f5es do &#8220;servidor&#8221; podem ser compostas em camadas<\/h2>\n<p><strong>A quinta restri\u00e7\u00e3o definida por Fielding \u00e9 que componentes &#8220;servidor&#8221; podem ser desenvolvidos a partir de composi\u00e7\u00f5es que obedecem o estilo de arquitetura em camadas.\u00a0<\/strong>Ou seja, componentes &#8220;cliente&#8221; tem acesso apenas a camada mais externa, e esta pode utilizar recursos de camadas inferiores, em diversas representa\u00e7\u00f5es, para compor novos recursos.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1994 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/layered.png\" alt=\"\" width=\"831\" height=\"515\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/layered.png 1070w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/layered-300x186.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/layered-1024x635.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/layered-768x477.png 768w\" sizes=\"(max-width: 831px) 100vw, 831px\" \/><\/p>\n<p>Camadas podem ser utilizadas para encapsular sistemas legados, protegendo tanto novos &#8220;clientes&#8221; de &#8220;servidores&#8221; legados, como para proteger novos &#8220;servidores&#8221; \u00a0de &#8220;clientes&#8221; legados.<\/p>\n<p>Camadas diferentes podem operar, inclusive, em n\u00edveis de abstra\u00e7\u00e3o distintos, prevenindo <em>changing coupling<\/em>. Por exemplo:<\/p>\n<ul>\n<li>em n\u00edvel mais baixo, expondo &#8220;entidades&#8221; como recursos nativos de sistemas pesados,<\/li>\n<li>em n\u00edvel intermedi\u00e1rio, expondo recursos relacionados a processos de neg\u00f3cio que s\u00e3o composi\u00e7\u00f5es das &#8220;entidades&#8221;<\/li>\n<li>em n\u00edvel mais alto, expondo recursos relacionados a &#8220;experi\u00eancia&#8221; que s\u00e3o composi\u00e7\u00f5es dos &#8220;processos&#8221;.<\/li>\n<\/ul>\n<hr \/>\n<p>Finalmente, tecnicamente, camadas tamb\u00e9m podem ser utilizadas para melhorar a escalabilidade habilitando funcionalidades como balanceamento de carga e represamento, protegendo sistemas legados n\u00e3o preparados para escalabilidade.<\/p>\n<h2>Componentes &#8220;servidor&#8221; podem fornecer\u00a0<em>code-on-demand\u00a0<\/em>para &#8220;clientes&#8221;<\/h2>\n<p><strong>A sexta, e \u00faltima, restri\u00e7\u00e3o indicada por Fielding \u00e9 que componentes &#8220;servidor&#8221; podem fornecer\u00a0<em>code-on-demand<\/em> para componentes &#8220;cliente&#8221;.\u00a0<\/strong>Ou seja, em sistemas\u00a0<em>RESTful<\/em>\u00a0componentes &#8220;servidor&#8221; podem extender funcionalidades de componentes &#8220;cliente&#8221; atrav\u00e9s do download de c\u00f3digo execut\u00e1vel na forma de <em>applets <\/em>ou\u00a0<em>scripts.\u00a0<\/em>Teoricamente, isso deve simplificar a implementa\u00e7\u00e3o de\u00a0<em>features\u00a0<\/em>comuns com implementa\u00e7\u00f5es pr\u00e9-implementadas.<\/p>\n<h2><span id=\"Conway_outra_vez\">Conway, outra vez!<\/span><\/h2>\n<p>O desenvolvimento de sistemas <em>RESTful\u00a0<\/em>preconiza clara separa\u00e7\u00e3o das equipes em desenvolvedores de componentes &#8220;cliente&#8221; e componentes &#8220;servidor&#8221;.<\/p>\n<p>Quando o modelo &#8220;em camadas&#8221; de componentes &#8220;servidor&#8221; \u00e9 adotado, \u00e9 comum, que cada camada seja mantida por um time dedicado. Ali\u00e1s, em casos extremos, cada componente &#8220;servidor&#8221;, em cada camada, poder\u00e1 ser mantido por um time especialista.<\/p>\n<p>Eventualmente, um time de opera\u00e7\u00f5es poder\u00e1 ser estabelecido para projeto, implementa\u00e7\u00e3o e manuten\u00e7\u00e3o de conectores. O mesmo tamb\u00e9m pode ocorrer para manuten\u00e7\u00e3o das fontes de dados.<\/p>\n<h2><span id=\"Conway_outra_vez\">Indica\u00e7\u00f5es e contraindica\u00e7\u00f5es<\/span><\/h2>\n<p>APIs REST parecem ser uma unanimidade. Infelizmente, essa &#8220;unanimidade&#8221; \u00e9 question\u00e1vel frente ao fato de que muitas implementa\u00e7\u00f5es n\u00e3o respeitam alguns de seus princ\u00edpios.<\/p>\n<p>APIs REST s\u00e3o, seguramente, mais acess\u00edveis e f\u00e1ceis de usar do que APIs SOAP. Entretanto, \u00e9 importante destacar que s\u00e3o, fundamentalmente,\u00a0<em>data-driven<\/em>. Eventualmente, alguns dom\u00ednios s\u00e3o melhor expressados \u00a0frente a modelos RPC.<\/p>\n<h2><span id=\"TODO\">\/\/ TODO<\/span><\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo as seguintes reflex\u00f5es:<\/p>\n<ol>\n<li>As implementa\u00e7\u00f5es auto-proclamadas <em>RESTful\u00a0<\/em>que voc\u00ea conhece realmente o s\u00e3o?<\/li>\n<li>Em que cen\u00e1rios voc\u00ea n\u00e3o utilizaria REST como estilo arquitetural para desenho de APIs?<\/li>\n<li>Voc\u00ea est\u00e1 habituado a utilizar HATEOAS?<\/li>\n<\/ol>\n","protected":false},"featured_media":2047,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[],"sessoes":[59],"apendices":[],"capitulos":[33],"class_list":["post-1941","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","sessoes-secao-3","capitulos-capitulo-3-5"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0 - Manual do Arquiteto de Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Conceito fundamental REST, acr\u00f4nimo para Representational State Transfer,\u00a0\u00e9 um estilo arquitetural para sistemas hiperm\u00eddia distribu\u00eddos. Ele foi introduzido e definido, no ano 2000, por Roy Fielding, em sua tese de doutorado. Trata-se de um conjunto de restri\u00e7\u00f5es arquiteturais aplicados a World Wide Web. Apenas sistemas desenvolvidos observando corretamente o estilo REST podem ser identificados como [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-11T21:02:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"773\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"16 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/\",\"name\":\"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0 - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png\",\"datePublished\":\"2021-06-07T03:15:33+00:00\",\"dateModified\":\"2024-01-11T21:02:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png\",\"width\":1024,\"height\":773},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0 - Manual do Arquiteto de Software","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:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/","og_locale":"pt_BR","og_type":"article","og_title":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0 - Manual do Arquiteto de Software","og_description":"Conceito fundamental REST, acr\u00f4nimo para Representational State Transfer,\u00a0\u00e9 um estilo arquitetural para sistemas hiperm\u00eddia distribu\u00eddos. Ele foi introduzido e definido, no ano 2000, por Roy Fielding, em sua tese de doutorado. Trata-se de um conjunto de restri\u00e7\u00f5es arquiteturais aplicados a World Wide Web. Apenas sistemas desenvolvidos observando corretamente o estilo REST podem ser identificados como [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T21:02:49+00:00","og_image":[{"width":1024,"height":773,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"16 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/","name":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0 - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png","datePublished":"2021-06-07T03:15:33+00:00","dateModified":"2024-01-11T21:02:49+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png","width":1024,"height":773},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-1-0\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 1.0"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/1941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=1941"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/2047"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=1941"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=1941"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=1941"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=1941"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=1941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}