Entendendo o conceito de HATEOAS

Spread the love

Introdução

No universo das APIs REST, uma das características mais avançadas e menos compreendidas é o conceito de HATEOAS (Hypermedia as the Engine of Application State). Ao contrário de outros tipos de APIs que exigem uma documentação externa ou um contrato pré-estabelecido, o HATEOAS propõe um modelo onde as próprias respostas da API guiam o cliente em como navegar entre os recursos. Isso transforma a interação com a API em algo dinâmico e adaptável, eliminando a dependência de definições externas e oferecendo uma flexibilidade considerável aos desenvolvedores de aplicações cliente. Neste artigo, vamos explorar em profundidade o que é HATEOAS, como ele se diferencia de outros padrões arquiteturais, e como ele pode ser implementado para maximizar a maturidade de uma API REST.

Explorando HATEOAS: O Nível Mais Avançado de Maturidade REST

HATEOAS (Hypermedia as the Engine of Application State) é uma constraint arquitetural dentro do contexto de aplicações REST. Trata-se de uma característica que permite que uma API HATEOAS forneça informações que ajudam os clientes a navegar dinamicamente entre seus endpoints. Isso ocorre porque as respostas das APIs HATEOAS incluem links que apontam para outros recursos relacionados, o que diferencia este padrão de outras abordagens como os sistemas baseados em SOA (Service-Oriented Architecture) e em interfaces definidas por WSDL (Web Services Description Language). Nestes últimos, servidores e clientes geralmente precisam seguir uma especificação estática que pode estar hospedada em algum local externo à API ou mesmo distribuída via outros meios, como por e-mail ou por websites.

Por outro lado, o uso de HATEOAS elimina a necessidade de uma especificação formal compartilhada previamente entre servidor e cliente. Isso acontece porque as informações necessárias para navegar pela API são fornecidas diretamente nas respostas, permitindo uma interação mais fluida e adaptável às mudanças na interface da API.

Nota: A pronúncia de HATEOAS varia bastante entre desenvolvedores. Algumas pessoas pronunciam algo parecido com “riteos”, enquanto outras utilizam “reitos” ou ainda “reidôs”. Alternativamente, o termo pode ser referido como um hypermedia-driven system (sistema dirigido por hipermídia).

Exemplos

Vamos ilustrar o conceito com um exemplo simples. A seguir, temos uma classe Cliente escrita em Java.

class Cliente {
    String nome;
}

Em uma representação JSON tradicional, o objeto gerado a partir dessa classe seria algo como:

{
    "nome" : "Leandro"
}

Os dados do Cliente estão presentes, mas sem quaisquer informações adicionais que permitam entender como esse recurso se conecta a outros. Agora, vamos ver como seria uma representação HATEOAS do mesmo objeto:

{
   "nome":"Leandro",
   "links":[
      {
         "rel":"self",
         "href":"http://localhost:8080/Cliente/1"
      }
   ]
}

Aqui, além de conter o nome da pessoa, a resposta também inclui um link para o recurso correspondente. Esse link serve como um ponto de navegação para outros dados associados ao cliente. A propriedade rel indica o tipo de relacionamento, que neste caso é self, ou seja, o link aponta para o próprio recurso. O atributo href fornece a URL completa do recurso, permitindo que o cliente acesse diretamente a informação relacionada.

É importante destacar que sistemas mais complexos podem definir múltiplos tipos de relacionamentos. Por exemplo, uma ordem de compra poderia ter uma relação com um cliente, utilizando algo como "rel": "Cliente" para indicar a associação entre a ordem e o cliente.

HATEOAS não impõe um formato específico para as respostas. Embora os exemplos aqui sejam em JSON, é perfeitamente possível utilizar outros formatos como XML. O foco de HATEOAS é prover links que permitem a navegação entre os recursos expostos pela API, independentemente do formato de serialização dos dados.

Complexidade e Dinamismo

Embora os exemplos acima sejam simples, as APIs HATEOAS podem construir relações bastante complexas. Essa flexibilidade é extremamente útil para os desenvolvedores, uma vez que eles podem explorar e consumir os recursos da API sem precisar consultar uma documentação externa ou seguir uma especificação previamente conhecida. A API se torna autoexplicativa, fornecendo as informações de navegação diretamente nas respostas.

Vejamos um exemplo mais detalhado de uma resposta HATEOAS, desta vez contendo uma lista de produtos:

{
   "conteudo":[
      {
         "preco":499.00,
         "descricao":"HD Seagate 2TB",
         "nome":"HD S2TB",
         "links":[
            {
               "rel":"self",
               "href":"http://localhost:8080/produto/1"
            }
         ],
         "atributos":{
            "conector":"SATA"
         }
      },
      {
         "preco":49.00,
         "descricao":"Mouse Óptico Dell",
         "nome":" Mouse",
         "links":[
            {
               "rel":"self",
               "href":"http://localhost:8080/produto/3"
            }
         ],
         "atributos":{
            "conector":"wireless"
         }
      }
   ],
   "links":[
      {
         "rel":"produto.consulta",
         "href":"http://localhost:8080/produto/consulta"
      }
   ]
}

Aqui, além das informações detalhadas sobre os produtos, como preço, descrição e atributos, a resposta contém links para cada recurso, permitindo que o cliente acesse as informações completas de cada item de forma direta. Esse modelo de navegação, suportado pelo HATEOAS, facilita a interação com a API de maneira dinâmica, sem exigir um conhecimento prévio dos endpoints disponíveis.

Maturidade do REST e HATEOAS

Segundo o Richardson Maturity Model, HATEOAS representa o nível mais alto de maturidade em uma API REST. Isso implica que, além de adotar os princípios fundamentais do REST, como o uso de verbos HTTP (GET, POST, PUT, DELETE), uma API madura baseada em HATEOAS também deve fornecer links adequados para que o cliente possa navegar pelos recursos.

Com isso, o cliente não só acessa os dados, mas também é guiado pela API a encontrar outros recursos relevantes, o que cria uma interface verdadeiramente hypermedia-driven.

Importante: Embora tenhamos ilustrado os exemplos usando JSON, o suporte a HATEOAS pode ser implementado em uma variedade de formatos de resposta, incluindo XML. O formato utilizado não é o aspecto central; o que importa é a capacidade de fornecer links navegáveis que descrevem as relações entre os recursos.

Conclusão

O conceito de HATEOAS não apenas eleva a maturidade de uma API REST, como também simplifica a interação dos clientes com os recursos, promovendo uma navegação dinâmica e autoexplicativa. Ao adotar essa prática, desenvolvedores podem construir APIs mais flexíveis e escaláveis, nas quais a necessidade de consultar documentação externa é reduzida ao mínimo. Aplicando HATEOAS corretamente, a API se torna mais intuitiva, uma vez que as próprias respostas guiam o cliente sobre os próximos passos a seguir. No próximo artigo, entraremos em uma abordagem prática com Spring Boot, onde veremos como implementar essa poderosa técnica em projetos reais.

Treinamentos relacionados com essa postagem

Leandro

Sou desenvolvedor de software a desde 2008, além de programar gosto de esportes de aventura como rapel, tirolesa, trilhas de bike, apreciador de cervejas, baladas, motos e do bom e velho Rock’n Roll também gosto de história, ficção científica e de tecnologia. Atualmente sou consultor de Agile Software Delivery na Erudio Training e instrutor na Udemy.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *