{"id":5216,"date":"2022-07-13T12:02:43","date_gmt":"2022-07-13T15:02:43","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=5216"},"modified":"2024-01-11T18:03:47","modified_gmt":"2024-01-11T21:03:47","slug":"fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-0","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-0\/","title":{"rendered":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 2.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<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;\">Buscando refer\u00eancias pr\u00e1ticas<\/p>\r\n<\/p>\n<p>Este cap\u00edtulo n\u00e3o visa ser um guia de refer\u00eancia de solu\u00e7\u00f5es REST, mas sim, fundamento para pensamento arquitetural.<\/p>\n<p>H\u00e1 uma pequena lista de &#8220;receitas de bolo&#8221; para problemas REST no <a href=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/capitulos\/xapendice-a\/\">Ap\u00eandice A<\/a>.<\/p>\n<p><\/div>\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, 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>Motiva\u00e7\u00f5es para REST<\/h2>\n<p>Embora seja comum associar REST ao desenvolvimento de APIs, suas motiv\u00e7\u00f5es s\u00e3o muito mais ambiciosas.\u00a0REST nasceu como uma abordagem para orientar a evolu\u00e7\u00e3o da arquitetura da Web!<\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <\/p>\n<p><em>Desde 1994, o estilo arquitet\u00f4nico REST tem sido usado para guiar o design e o desenvolvimento da arquitetura para a Web moderna.<\/em><\/p>\n<p>\r\n<p><strong>Roy Fielding<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Em sua teste, Roy Fielding descreve, tamb\u00e9m, um combinado de li\u00e7\u00f5es aprendidas com a aplica\u00e7\u00e3o de REST durante a cria\u00e7\u00e3o dos padr\u00f5es da Internet para o protocolo de transfer\u00eancia de hipertexto (HTTP) e identificadores de recursos uniformes (URI), as duas especifica\u00e7\u00f5es que definem a interface gen\u00e9rica usada por todas as intera\u00e7\u00f5es de componentes na Web, como bem como da implanta\u00e7\u00e3o dessas tecnologias na forma da biblioteca cliente libwww-perl, o Projeto de servidor HTTP Apache e outras implementa\u00e7\u00f5es de padr\u00f5es de protocolo.<\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <\/p>\n<p><em>A motiva\u00e7\u00e3o para desenvolver REST foi criar um modelo de arquitetura de como a Web deveria funcionar, de forma que pudesse servir como a estrutura de orienta\u00e7\u00e3o para os padr\u00f5es de protocolo da Web. O REST foi aplicado para descrever a arquitetura da Web desejada, ajudar a identificar problemas existentes, comparar solu\u00e7\u00f5es alternativas e garantir que as extens\u00f5es de protocolo n\u00e3o violem as principais restri\u00e7\u00f5es que tornam a Web bem-sucedida. Este trabalho foi feito como parte dos esfor\u00e7os do Internet Engineering Taskforce (IETF) e do World Wide Web Consortium (W3C) para definir os padr\u00f5es de arquitetura para a Web: HTTP, URI e HTML.<\/em><\/p>\n<p>\r\n<p><strong>Roy Fielding<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Filosofia REST<\/h2>\n<p>O pleno entendimento de REST come\u00e7a pela interpreta\u00e7\u00e3o do que o acr\u00f4nimo significa. <em><strong>RE<\/strong>presentational <strong>S<\/strong>tate <strong>T<\/strong>ransfer\u00a0<\/em>literalmente expressa a intencionalidade do estilo arquitetural: transfer\u00eancia de estado atrav\u00e9s de representa\u00e7\u00f5es.<\/p>\n<p>As tranfer\u00eancias de estado, em sentido amplo, n\u00e3o se restringem apenas pelo conjunto de dados associados a um recurso, mas tamb\u00e9m \u00e0s opera\u00e7\u00f5es que este recurso suporta. Os diversos componentes computacionais que formam uma solu\u00e7\u00e3o REST &#8220;transferem estado&#8221; entre si, afim de preservar consist\u00eancia.<\/p>\n<p>A transfer\u00eancia de estado entre componentes, coloca os recursos como as &#8220;estrelas da festa&#8221;, ou seja, o centro de qualquer intera\u00e7\u00e3o. Afinal, em sentido amplo, trasnfer\u00eancias de estado acontecem pela cria\u00e7\u00e3o, modifica\u00e7\u00e3o, recupera\u00e7\u00e3o e remo\u00e7\u00e3o de recursos, orquestradas por um componente em outro remoto.<\/p>\n<p>O conjunto limitado e padronizado de opera\u00e7\u00f5es que transferem estado conferem a arquireturas <em>RESTful\u00a0<\/em>simplicidade. Ou mesmo conjunto uniforme de opera\u00e7\u00f5es pode ser aplicado a qualquer recursos, de maneira consistente, atrav\u00e9s de um conjunto tamb\u00e9m bem delimitado de verbos HTTP.<\/p>\n<p>A transfer\u00eancia mais \u00f3bvia de estado acontece quando um componente solicita a outro a representa\u00e7\u00e3o correspondente a uma vers\u00e3o, geralmente o &#8220;momento atual&#8221;, de um recurso, utilizando para isso o verbo <em>HTTP GET<\/em>.<\/p>\n<p>Menos evidentes s\u00e3o as transfer\u00eancias de estado que acontecem quando um componente envia estado &#8211; representa\u00e7\u00f5es de um recurso &#8211; para outro, geralmente com verbos <em>HTTP POST<\/em> e <em>HTTP PUT.<\/em><\/p>\n<p>Finalmente, tamb\u00e9m s\u00e3o transfer\u00eancias de estado atualiza\u00e7\u00f5es parciais de recursos, geralmente aplicadas com verbos <em>HTTP POST<\/em> e <em>HTTP PATCH,<\/em> bem como opera\u00e7\u00f5es de exclus\u00e3o de recursos realizadas com <em>HTTP DELETE<\/em>.<\/p>\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 loading=\"lazy\" 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 loading=\"lazy\" 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>Toda URI \u00e9 <em>RESTful<\/em><\/h2>\nN\u00e3o h\u00e1 d\u00favidas sobre a utilidade de um bom projeto de URIs. Entretanto, \u00e9 importante destacar que n\u00e3o h\u00e1 qualquer especifica\u00e7\u00e3o sobre como URIs devem ser constru\u00eddas para ser mais ou menos aderentes a REST. <strong>Toda URI \u00e9 <em>RESTful<\/em>!<\/strong>\n<hr \/>\n<p>Sistemas <em>RESTful<\/em> s\u00e3o compostos por conjuntos de recursos, conectados via hiperm\u00eddia, obedecendo a formatos e padr\u00f5es.\u00a0URIs consistentes funcionam como identidades universais perenes para recursos que devem funcionar, todos, como &#8220;ponto de entrada&#8221; para o sistema.<\/p>\n<h2>URIs s\u00e3o &#8220;identificadores&#8221;&#8230; e s\u00f3 isso!<\/h2>\n<p>O projeto de URIs deixa de ser <em>RESTful<\/em> quando, por qualquer raz\u00e3o, eleva URIs a assumir responsabilidades al\u00e9m de identificar recursos.<\/p>\nSejamos claros! URIs como <em>http:\/\/my-domain\/hdservices\/format?drive=c<\/em>\u00a0ou, ainda, <em>http:\/\/my-domain\/customers\/delete?id=123, <\/em>ou <em>http:\/\/my-domain\/customers\/123\/delete<\/em> s\u00e3o, por defini\u00e7\u00e3o,\u00a0<em>RESTful<\/em> porque, em teoria, \u00e9 uma sequ\u00eancia v\u00e1lida de caracteres. Agora, o problema \u00e9 atribuir, al\u00e9m da &#8220;responsabilidade&#8221; de identificar um recurso, sem\u00e2ntica de a\u00e7\u00e3o &#8211; \u00e9 esse o erro conceitual.\n<hr \/>\n<h2>O projeto de URIs n\u00e3o substitui <em>HATEOAS<\/em><\/h2>\n<p><strong>N\u00e3o \u00e9 incomum, no projeto de APIs, estabelecer rela\u00e7\u00f5es de hierarquia implicitamente e isso \u00e9 risco para implementa\u00e7\u00f5es <em>RESTful<\/em>.<\/strong> Por exemplo, \u00e9 natural que assumir que:<\/p>\n<ul>\n<li><em>http:\/\/my-service\/customers\u00a0<\/em>retorne uma (representa\u00e7\u00e3o do recurso) rela\u00e7\u00e3o de clientes;<\/li>\n<li><em>http:\/\/my-service\/customers\/123\u00a0<\/em>retorne uma (representa\u00e7\u00e3o do recurso) cliente 123;<\/li>\n<li><em>http:\/\/my-service\/customers\/123\/orders\u00a0<\/em>retorne uma (representa\u00e7\u00e3o do recurso) rela\u00e7\u00e3o dos pedidos do\u00a0cliente 123;<\/li>\n<\/ul>\n<p>Tamanha naturalidade incentiva o componentes &#8220;cliente&#8221; a navegar pelos diversos recursos fazendo &#8220;concatena\u00e7\u00f5es de string&#8221;, criando um acoplamento indesejado. Da\u00ed, a \u00eanfase a <em>HATEOAS<\/em>.<\/p>\n<p>REST preconiza que a navega\u00e7\u00e3o entre recursos relacionados aconte\u00e7a atrav\u00e9s de\u00a0<em>links\u00a0<\/em>como metadados do recurso. Isso confere a cada recurso a possibilidade de operar como um ponto de entrada no sistema.<\/p>\n<h2>REST n\u00e3o \u00e9 CRUD<\/h2>\n<strong>H\u00e1 uma confus\u00e3o frequente entre os conceitos de transfer\u00eancias de estado, atrav\u00e9s de representa\u00e7\u00f5es, e opera\u00e7\u00f5es CRUD<\/strong>. N\u00e3o \u00e9 incomum ver, por exemplo, a associa\u00e7\u00f5es de <strong>C<\/strong>REATE com o verbo HTTP POST, <strong>R<\/strong>ETRIEVE com o verbo HTTP GET, <strong>U<\/strong>PDATE com HTTP PUT e, finalmente, <strong>D<\/strong>ELETE com HTTP DELETE. <strong>Esta \u00e9 uma vis\u00e3o ing\u00eanua e superficial.<\/strong>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <\/p>\n<p><em>Algumas pessoas pensam que REST sugere n\u00e3o usar POST para atualiza\u00e7\u00f5es. Pesquise minha disserta\u00e7\u00e3o e voc\u00ea n\u00e3o encontrar\u00e1 nenhuma men\u00e7\u00e3o a CRUD ou POST. A \u00fanica men\u00e7\u00e3o de PUT \u00e9 em rela\u00e7\u00e3o \u00e0 falta de cache de write-back do HTTP.<\/em><\/p>\n<p>\r\n<p><strong>Roy Fielding<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <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><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.<\/em>\r\n<p><strong>Roy Fielding<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\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>A &#8220;onipresen\u00e7a&#8221; da lei de Hyrum<\/h2>\n<p>A lei de Hyrum, que governa as integra\u00e7\u00f5es, tamb\u00e9m \u00e9 v\u00e1lida para o design de APIs REST.<\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>Com um n\u00famero suficiente de usu\u00e1rios, n\u00e3o importa o que estiver acertado em contrato: todos os comportamentos observ\u00e1veis de um sistema ser\u00e3o premissas para funcionamento de outros artefatos.<\/em>\r\n<p><strong>Roy Fielding<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\nA perversidade dessa lei \u00e9 o fundamento para o cuidado do projeto cuidadoso. Se n\u00e3o houver \u00eanfase em HATEOAS, h\u00e1 tend\u00eancia de sobrecarga na padroniza\u00e7\u00e3o de URLs e na utiliza\u00e7\u00e3o de conven\u00e7\u00f5es de verbos, transformando sistemas, perigosamente, em aglomerados de CRUD.\n<h2>O modelo de maturidade de Leonard Richardson (RMM)<\/h2>\n<p>Leonard Richardson, famoso autor de livros sobre REST, prop\u00f4s um modelo de quatro categorias de compatibilidade (melhor do que maturidade) \u00a0com REST. Trata-se Richardson Maturity Model (RMM)<\/p>\n<p>O primeiro n\u00edvel proposto por Richardson (<em>level zero<\/em>) \u00e9 dedicado aos servi\u00e7os que n\u00e3o fazem uso apropriado de identificadores, tampouco dos verbos HTTP ou HATEOAS. S\u00e3o exemplos de APIs nesse n\u00edvel aquelas desenvolvidas usando XML-RPC.<\/p>\n<p>Servi\u00e7os no segundo n\u00edvel <em>(level<\/em> one),\u00a0segundo o RMM, utilizam URIs de maneira consistente, por\u00e9m apenas com um \u00fanico verbo HTTP (geralmente POST).<\/p>\n<p>No terceiro n\u00edvel (<em>level two<\/em>), est\u00e3o os servi\u00e7os que j\u00e1 fazem uso adequado de URIs e tamb\u00e9m semanticamente ajustado dos verbos HTTP. Trata-se da maioria das implementa\u00e7\u00f5es REST-like.\u00a0Finalmente, servi\u00e7os no quarto\u00a0n\u00edvel (<em>level three<\/em>) tem recursos implementando HATEOAS.<\/p>\n<p>Conforme Roy Fielding, apenas servi\u00e7os no quarto n\u00edvel no RMM s\u00e3o <em>RESTful<\/em>.<\/p>\n<h2>Versionamento, que versionamento?<\/h2>\n<p>Uma discuss\u00e3o recorrente (e importante) relacionada ao\u00a0<em>design\u00a0<\/em>de APIs tem rela\u00e7\u00e3o com pol\u00edticas de versionamento. Com frequ\u00eancia, assume-se a necessidade de versionar APIs e, n\u00e3o raro, a solu\u00e7\u00e3o \u00e9 indicar vers\u00e3o das URLs dos recursos (o que entra em conflito com a estabilidade dos identificadores).<\/p>\n<p>Dados de um recurso s\u00e3o naturalmente modificados ao longo do tempo e, seguramente, demandam uma estrat\u00e9gia de versionamento, seja <em>ETags\u00a0<\/em>ou\u00a0<em>Last-Modified,\u00a0<\/em>que ocorre quase de forma natural.<\/p>\n<p>A documenta\u00e7\u00e3o das APIs tamb\u00e9m \u00e9 version\u00e1vel, embora, quanto mais &#8220;<em>HATEOAS<\/em>&#8220;, mais evolucion\u00e1ria e menos revolucion\u00e1ria (<em>evolvability<\/em>) \u00e9 a mec\u00e2nica de intera\u00e7\u00e3o devido a natureza auto-descritiva das mensagens.<\/p>\n<p>Finalmente, a evolu\u00e7\u00e3o das representa\u00e7\u00f5es tamb\u00e9m \u00e9 mais f\u00e1cil frente a possibilidade de usar negocia\u00e7\u00e3o e especializa\u00e7\u00e3o.<\/p>\nO versionamento combinado de dados, documenta\u00e7\u00e3o e representa\u00e7\u00f5es mitiga a necessidade de versionamento expl\u00edcito de APIs.\n<h2>O &#8220;jeito certo&#8221; de retornar erros (RFC 7807)<\/h2>\n<p><strong>A beleza da op\u00e7\u00e3o por <em>Null Style\u00a0<\/em>de Roy Fielding \u00e9 que REST continua evoluindo junto com a WWW. Ou seja, como REST \u00e9 WWW com restri\u00e7\u00f5es, sempre que WWW evolui, ent\u00e3o, REST tamb\u00e9m evolui.<\/strong><\/p>\n<p>Um das dificuldades frequentes no projeto de APIs era a estrutura\u00e7\u00e3o de <em>responses\u00a0<\/em>indicando falhas de processamento. N\u00e3o havia, um padr\u00e3o formal para apresentar detalhes sobre problemas ocorridos. Felizmente, isso muda com a RFC 7807, que embora ainda seja uma proposi\u00e7\u00e3o, j\u00e1 \u00e9 madura.<\/p>\n<p>Abaixo, um exemplo de retorno conforme a RFC:<\/p>\n<pre>HTTP\/1.1 403 Forbidden\r\nContent-Type: application\/problem+json\r\nContent-Language: en\r\n\r\n{\r\n  \"type\": \"https:\/\/example.com\/probs\/out-of-credit\",\r\n  \"title\": \"You do not have enough credit.\",\r\n  \"detail\": \"Your current balance is 30, but that costs 50.\",\r\n  \"instance\": \"\/account\/12345\/msgs\/abc\",\r\n  \"balance\": 30,\r\n  \"accounts\": [\"\/account\/12345\",\r\n               \"\/account\/67890\"]\r\n }\r\n<\/pre>\n<p>Outro exemplo, indicando problemas com par\u00e2metros:<\/p>\n<pre>HTTP\/1.1 400 Bad Request\r\nContent-Type: application\/problem+json\r\nContent-Language: en\r\n\r\n{\r\n  \"type\": \"https:\/\/example.net\/validation-error\",\r\n  \"title\": \"Your request parameters didn't validate.\",\r\n  \"invalid-params\": [ {\r\n                         \"name\": \"age\",\r\n                         \"reason\": \"must be a positive integer\"\r\n                       },\r\n                       {\r\n                         \"name\": \"color\",\r\n                         \"reason\": \"must be 'green', 'red' or 'blue'\"}\r\n                     ]\r\n}\r\n<\/pre>\n<h2>Postel, outra vez!<\/h2>\n<p>J\u00e1 indicamos que a\u00a0<strong class=\"gt io\">Lei de Postel<\/strong>\u00a0\u2014 ou Lei da Robustez \u2014 preconiza\u00a0que sistemas sejam 1) conservadores no que enviam e ; 2) liberais no que recebem. Da\u00ed \u00e9 importante observar algumas recomenda\u00e7\u00f5es:<\/p>\n<ol>\n<li>Desenvolvedores &#8220;cliente&#8221; devem operar sem depend\u00eancias para estruturas de URI. Enquanto isso, desenvolvedores &#8220;servidor&#8221; n\u00e3o devem quebrar estruturas de URI \u00a0desnecessariamente.<\/li>\n<li>Desenvolvedores &#8220;cliente&#8221; devem suportar novos\u00a0<em>links\u00a0<\/em>em hiperm\u00eddia. Desenvolvedores &#8220;servidor&#8221; devem evoluir via novos\u00a0<em>links\u00a0<\/em>hiperm\u00eddia.<\/li>\n<li>Desenvolvedores &#8220;cliente&#8221; devem ignorar &#8220;conte\u00fado desconhecido&#8221;. Desenvolvedores &#8220;servidor&#8221; devem suportar formatos antigos.<\/li>\n<\/ol>\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-5216","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 2.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-2-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 2.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-2-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:03:47+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=\"25 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-2-0\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-0\/\",\"name\":\"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 2.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-2-0\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-0\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png\",\"datePublished\":\"2022-07-13T15:02:43+00:00\",\"dateModified\":\"2024-01-11T21:03:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-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-2-0\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-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-2-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 2.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 2.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-2-0\/","og_locale":"pt_BR","og_type":"article","og_title":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 2.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-2-0\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T21:03:47+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":"25 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-2-0\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-0\/","name":"Fundamentos para sistemas com arquiteturas REST \/ Cap\u00edtulo 9 v 2.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-2-0\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-0\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/rest.png","datePublished":"2022-07-13T15:02:43+00:00","dateModified":"2024-01-11T21:03:47+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-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-2-0\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-sistemas-com-arquiteturas-rest-capitulo-9-v-2-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-2-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 2.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\/5216","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=5216"}],"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=5216"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=5216"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=5216"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=5216"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=5216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}