Do endpoint único à hipermídia: como avaliar, evoluir e governar APIs HTTP sem confundir níveis de adoção com conformidade arquitetural completa
Edição aprofundada - material de estudo e consulta profissional
Por João Ricardo Dutra••Material integral
Evolução da interface segundo o
Visão geral - único, recursos, e formam uma progressão cumulativa de capacidades observáveis.
Cada nível acrescenta uma capacidade de desenho; o modelo não certifica conformidade completa com .
Apresentação do capítulo
O , normalmente abreviado como , organiza interfaces de serviços em quatro níveis: um ponto de entrada orientado a mensagens, recursos identificáveis, uso semântico do e controles de . O modelo foi proposto por Leonard Richardson e popularizado por Martin Fowler como um caminho didático para decompor alguns elementos centrais de uma abordagem . Seu valor está em permitir que equipes observem capacidades concretas da interface sem depender apenas do rótulo “ ”.
O modelo, entretanto, não é uma norma de certificação e não substitui as restrições arquiteturais descritas por Roy Fielding. Uma pode atingir o nível 2 ao utilizar recursos, métodos e códigos de forma consistente e ainda manter sessão conversacional no servidor, impedir , expor detalhes de implementação ou criar forte acoplamento temporal. Da mesma forma, uma interface pode adotar links sem que seus clientes realmente naveguem pelas transições oferecidas. Portanto, nível e qualidade não são sinônimos automáticos.
Neste capítulo, cada nível será analisado em profundidade, com exemplos de corporativas e bancárias fictícias. Serão estudados os efeitos sobre contratos, consumidores, , , , , autorização, observabilidade e evolução. O objetivo não é defender que toda deva alcançar o nível 3, mas fornecer critérios para escolher conscientemente até onde avançar e quais propriedades se deseja obter.
A análise também mostrará que a migração entre níveis não é apenas uma troca de . Ela exige identificar recursos, separar comandos de representações, atribuir semântica correta a métodos e respostas, definir relações de , planejar compatibilidade e ajustar políticas do . Em ambientes com muitos consumidores, a sequência de evolução precisa ser mensurável e reversível.
Como estudar este capítulo Use a mesma operação de negócio ao atravessar todos os níveis. Compare a forma de endereçar, a intenção expressa pelo método, os códigos retornados, a possibilidade de , as regras de e o conhecimento exigido do cliente. A comparação revela melhor o que cada nível acrescenta.
Objetivos de aprendizagem
Explicar a origem, a finalidade e os limites do .
Diferenciar os níveis 0, 1, 2 e 3 por propriedades observáveis da interface.
Reconhecer padrões e mensagens imperativas concentradas em um .
Modelar recursos estáveis sem confundir , tabela, DTO e operação.
Aplicar métodos, códigos, , e precondições do no nível 2.
Projetar links e ações de que representem transições permitidas.
Comparar com as restrições arquiteturais de e com .
Avaliar existentes sem transformar a análise em uma pontuação superficial.
Planejar migração incremental, governança e em .
Estrutura do capítulo
11.1 Origem e finalidade do modelo
11.2 O que o mede - e o que não mede
11.3 Visão geral dos quatro níveis
11.4 Nível 0: o pântano de
11.5 Padrões e riscos operacionais do nível 0
11.6 Transição do nível 0 para o nível 1
11.7 Nível 1: recursos
11.8 Identidade, granularidade e ciclo de vida
11.9 Limitações do nível 1
11.10 Transição para o nível 2
11.11 Nível 2: métodos e
11.12 Status, , e precondições
11.13 , e erros
11.14 Nível 2 em
11.15 Nível 3: controles de
11.16 Relações, links e ações
11.17 Tipos de mídia e contratos de
11.18 Clientes orientados por transições
11.19 Benefícios, custos e armadilhas do nível 3
11.20 versus de Fielding
11.21 , e governança
11.22 Matriz de avaliação
11.23 Estratégia de migração
11.24 Observabilidade e
11.25 Estudos de caso e laboratórios
Resumo, checklist, exercícios, glossário e referências
11.1 Origem e finalidade do modelo
Leonard Richardson formulou o modelo como uma maneira de classificar estilos de serviços web pela adoção progressiva de recursos da Web. Martin Fowler o popularizou em 2010 com a imagem de uma escada: no nível 0 existe um único ponto de entrada orientado a mensagens; no nível 1 aparecem recursos; no nível 2 a interface usa métodos e respostas ; no nível 3 as representações oferecem controles de . A simplicidade dessa decomposição tornou o útil em treinamentos, revisões de arquitetura e discussões de modernização.
A palavra maturidade pode induzir uma interpretação equivocada. O nível superior não significa necessariamente que o produto, a equipe ou o domínio sejam “mais maduros” em todos os aspectos. O modelo descreve uma dimensão específica da interface. Segurança, disponibilidade, governança, documentação, desempenho, privacidade, consistência e experiência do desenvolvedor precisam de avaliações próprias. Uma de nível 2 pode ser altamente confiável e adequada ao contexto; uma de nível 3 pode ser insegura ou mal operada.
O modelo funciona melhor como linguagem de diagnóstico. Em vez de perguntar apenas “esta é ?”, a equipe pode perguntar: há recursos identificáveis? Os métodos expressam intenção? A resposta usa status e coerentes? O consumidor descobre transições por ? Essas perguntas produzem evidências e decisões de evolução.
Uso responsável do termo maturidade Use o nível para descrever capacidades da interface, não para classificar pessoas ou determinar qualidade total. Registre separadamente atributos como segurança, compatibilidade, , documentação, governança e custo operacional.
11.2 O que o mede - e o que não mede
O observa principalmente três movimentos: decompor uma operação genérica em recursos identificáveis, aproveitar a semântica padronizada do e tornar transições visíveis na própria . Esses movimentos reduzem parte do acoplamento entre consumidor e servidor porque transferem conhecimento para elementos compartilhados da Web: , métodos, códigos, , links e relações.
O modelo não verifica todas as restrições de . Cliente-servidor, , , sistema em camadas e código sob demanda não aparecem como degraus independentes. O nível 2 toca e interface uniforme, e o nível 3 se aproxima da como motor do estado da aplicação, mas a avaliação completa de exige análise arquitetural mais ampla. Por isso, Fowler descreve o nível 3 como um passo em direção à “glória de ”, não como uma prova automática de conformidade.
Também não existe um teste universal para decidir o nível quando a mistura estilos. Uma plataforma pode possuir de consulta no nível 2, comandos legados no nível 0 e um fluxo específico com . Nesses casos, classificar a inteira por um único número esconde informação. A análise deve ser feita por superfície, ou jornada de negócio, registrando exceções.
11.3 Visão geral dos quatro níveis
Figura 1 - O organiza capacidades da interface em quatro níveis cumulativos, mas não mede todos os atributos de uma plataforma de .
Tabela 1 - Capacidades, dependências e riscos associados a cada nível.
Nível
Elemento acrescentado
Conhecimento principal do cliente
Risco característico
0
Mensagens sobre um endpoint
Operações e formato proprietário
Dispatcher central, pouca semântica compartilhada
1
Recursos e identificadores
Quais recursos existem e como endereçá-los
Recursos tratados apenas como envelopes de comandos
2
Métodos, status e headers HTTP
Semântica do protocolo e contrato do recurso
Uso decorativo de verbos ou códigos inconsistentes
3
Controles de hipermídia
Relações e tipos de mídia
Links sem semântica ou clientes que continuam codificando o fluxo
11.4 Nível 0: o pântano de
No nível 0, o serviço costuma publicar um único e usar o corpo da mensagem para indicar qual operação deve ser executada. significa “Plain Old ”, expressão histórica para mensagens sem aproveitar recursos mais ricos da Web; na prática atual, a mesma estrutura pode aparecer com , Protobuf ou outro formato. O aspecto decisivo não é o formato, mas a concentração das intenções em uma interface genérica.
Um serviço de pagamentos poderia receber sempre /servico-pagamentos e distinguir operações por um campo como operation. Consultar saldo, criar transferência, cancelar agendamento e emitir extrato compartilham o mesmo endereço e método. O servidor atua como dispatcher: interpreta o comando e encaminha para a rotina correspondente. Muitos serviços , sobre e integrações legadas se aproximam desse nível.
Figura 2 - No nível 0, o protocolo transporta uma mensagem proprietária e o corpo concentra a intenção da operação.
O nível 0 não é sinônimo de implementação ruim. Em cenários fechados, filas de comandos, protocolos binários, operações altamente especializadas ou compatibilidade com sistemas antigos, pode ser uma decisão válida. O problema surge quando a organização espera propriedades da Web - , semântica uniforme, visibilidade por intermediários e evolução desacoplada - sem expor elementos que permitam obtê-las.
11.5 Padrões e riscos operacionais do nível 0
A principal consequência é que componentes intermediários enxergam pouca diferença entre operações. Um observa vários para o mesmo caminho, e a distinção real está escondida no corpo. Regras de autorização, quotas, , métricas e roteamento precisam inspecionar conteúdo ou confiar em campos proprietários. Isso aumenta custo de política, reduz desempenho e dificulta correlação com ferramentas que agregam métricas por método e rota.
também se tornam arriscados. O método não informa se uma operação é repetível, e o mesmo pode conter consultas, comandos idempotentes e comandos não idempotentes. Um deixa o cliente sem saber se o servidor executou a ação. A solução costuma exigir identificadores de correlação, chaves de ou status de processamento, mas esses mecanismos precisam ser definidos fora da semântica básica do protocolo.
Erros frequentemente retornam 200 com um envelope contendo success=false ou códigos internos. Essa prática impede que , , SDKs e observabilidade usem a classe de status como sinal. Também cria ambiguidade entre falha de transporte, rejeição do e erro de negócio. O consumidor precisa interpretar o corpo antes de classificar qualquer resultado.
Sinal de nível 0 Se a documentação começa por uma lista de operações aceitas em um campo action, command, operation ou serviceName e quase tudo usa no mesmo caminho, a interface provavelmente está no nível 0, mesmo quando as mensagens são e o produto é chamado de .
Tabela 2 - Efeitos típicos de uma interface concentrada no nível 0.
Sintoma
Impacto no gateway
Impacto no consumidor
Um URI para tudo
Políticas dependem de inspeção do body
SDK precisa conhecer dispatcher e códigos internos
200 para sucesso e erro
Métricas por status ficam enganosas
Tratamento de erro depende do envelope
POST para leitura e escrita
Cache e segurança não podem inferir intenção
Retry exige regra específica por operação
Contrato central extenso
Mudanças afetam grande superfície
Versionamento e testes tornam-se monolíticos
11.6 Transição do nível 0 para o nível 1
A primeira transição consiste em tornar explícitas as entidades ou conceitos que possuem identidade e ciclo de vida. Em vez de enviar todas as mensagens a /servico, a interface passa a endereçar clientes, contas, transferências, agendamentos e extratos. Essa mudança exige compreender o domínio: uma transferência não é apenas uma função; ela pode ser criada, validada, confirmada, rejeitada, cancelada e consultada ao longo do tempo.
A migração deve começar por inventário. Cada operação do dispatcher é classificada como consulta, criação, alteração, comando, processo ou integração. Em seguida, a equipe identifica quais objetos precisam de endereço estável, quais são subordinados a outros e quais representam processos. O objetivo não é transformar cada tabela em , mas encontrar unidades de significado que consumidores possam referenciar.
Compatibilidade pode ser preservada com uma camada de adaptação. O legado continua aceitando mensagens e internamente chama os novos serviços orientados a recursos. Novos consumidores adotam a superfície nova, enquanto métricas medem a redução de uso do contrato antigo. Essa estratégia evita uma migração “big bang” e permite validar a modelagem antes de remover o dispatcher.
Pergunta de modelagem O que precisa ser identificado, consultado ou referenciado depois da operação terminar? A resposta frequentemente revela um . Uma solicitação de transferência, por exemplo, continua existindo como entidade auditável mesmo após a resposta inicial.
11.7 Nível 1: recursos
No nível 1, a interface publica múltiplos recursos com identificadores próprios. O consumidor deixa de conhecer apenas uma porta de entrada genérica e passa a interagir com endereços que representam partes do domínio. A funciona como identificador, não como descrição completa da implementação. /transferencias/abc pode continuar válido mesmo que o serviço mude de banco, linguagem ou topologia.
O modelo não exige que o nível 1 utilize corretamente todos os métodos . A pode continuar enviando para /clientes/483/consultar, /transferencias/abc/cancelar ou /contas/991/extrato. Houve avanço na identificação, mas a intenção ainda está parcialmente codificada em verbos do caminho ou no corpo. Essa característica explica por que recursos são necessários, porém insuficientes para uma interface semanticamente rica.
Figura 3 - Recursos distintos tornam identidade e escopo visíveis, embora operações ainda possam permanecer imperativas.
11.8 Identidade, granularidade e ciclo de vida
Um é uma abstração identificável, e não obrigatoriamente uma linha de banco. Pode representar uma entidade durável, uma coleção, uma projeção, um documento, um processo ou o resultado de um cálculo. /limites-operacionais/cliente-483 pode ser uma visão calculada; /solicitacoes-transferencia/abc pode representar um processo; /extratos/conta-991/2026-07 pode representar um documento produzido para um período.
A granularidade deve refletir coesão e padrões de acesso. Recursos excessivamente grandes forçam consumidores a transferir e atualizar dados irrelevantes. Recursos muito fragmentados aumentam round trips e complexidade de composição. Em sistemas corporativos, a fronteira também precisa considerar autorização, ownership, consistência transacional e capacidade de evolução independente.
Identificadores públicos não devem expor chaves internas sem necessidade. Um número sequencial pode facilitar enumeração e revelar volume; uma chave de tabela pode mudar durante migrações. A pode usar identificadores opacos, aliases de negócio ou estáveis. O importante é definir unicidade, escopo, permanência e comportamento quando o é removido ou substituído.
Tabela 3 - Perguntas para modelar recursos no nível 1.
Decisão
Pergunta técnica
Exemplo
Identidade
O recurso precisa ser referenciado depois?
/transferencias/{id}
Escopo
A identidade é global ou subordinada?
/contas/{conta}/agendamentos/{id}
Granularidade
Quais dados mudam e são autorizados juntos?
preferências separadas do cadastro
Ciclo de vida
Quais estados e transições existem?
PENDENTE -> CONFIRMADA -> LIQUIDADA
Permanência
O identificador sobrevive a migrações internas?
ID público opaco
11.9 Limitações do nível 1
Separar recursos melhora observabilidade e organização, mas não resolve sozinho a semântica das operações. como /transferencias/abc/consultar e /transferencias/abc/remover ainda escondem propriedades conhecidas pelo . O não pode inferir que consultar é seguro ou que remover deve produzir determinada classe de resposta. O cliente depende de convenções específicas de cada .
Outro risco é criar “recursos falsos” apenas para acomodar verbos. Caminhos como /criarTransferencia, /executarPagamento ou /obterClientes usam múltiplos endereços, porém continuam modelando funções. Essa interface pode ser clara e funcional, mas o avanço em direção à interface uniforme é limitado. A análise deve observar o significado do identificador, não apenas contar .
No nível 1, coleções e relações também podem ser inconsistentes. Uma equipe pode usar /cliente/483/conta e outra /consultarContasPorCliente?id=483. Sem padrões de nomenclatura, cardinalidade, paginação e erros, a expansão de recursos aumenta a superfície sem gerar previsibilidade. Governança continua necessária.
11.10 Transição para o nível 2
A segunda transição consiste em mapear intenções para a semântica do . Consultas usam ou ; criação costuma usar na coleção; substituição idempotente pode usar ; remoção usa ; atualizações parciais podem usar quando seu formato e semântica são definidos. O método deixa de ser apenas um campo de transporte e passa a comunicar propriedades a clientes e intermediários.
Essa migração exige também revisar respostas. A criação pode retornar 201 Created com Location; processamento assíncrono pode usar 202 Accepted; precondição não satisfeita pode produzir 412; conflito de estado pode produzir 409; validação pode utilizar . como , -Control, Allow, -After e Vary passam a fazer parte do contrato.
Não basta substituir por verbos diferentes. O comportamento precisa respeitar segurança, e semântica. Um que cancela um agendamento continua perigoso, ainda que o caminho pareça orientado a recursos. Um que cria efeitos adicionais em cada repetição não é idempotente. O nível 2 depende de comportamento observável, não de decoração sintática.
Exemplo de leitura com
GET /transferencias/abc HTTP/1.1
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
ETag: "v7"
{ "id": "abc", "status": "PENDENTE", "valor": 120.00 }
Critério de transição Para cada operação, registre: alvo, método, propriedade de segurança, , resposta de sucesso, erros, , possibilidade de e política de . A tabela evidencia onde a troca de verbo exige mudança real de comportamento.
11.11 Nível 2: métodos e
No nível 2, a interface utiliza o vocabulário do para expressar intenções. A semântica é compartilhada por navegadores, bibliotecas, , e ferramentas de observabilidade. é seguro e não deve solicitar alteração de estado; e são idempotentes; é flexível e normalmente não idempotente; possui a mesma semântica de sem conteúdo de resposta. depende do tipo de documento de utilizado.
O benefício não é apenas estético. Um pode aplicar regras diferentes para leitura e escrita, podem reutilizar respostas, SDKs podem classificar resultados por status, clientes podem implementar de operações idempotentes com mais segurança e equipes de SRE podem agrupar métricas por método e rota. A interface torna-se mais visível para componentes que não conhecem o domínio.
Figura 4 - Métodos e respostas padronizadas permitem que componentes genéricos compreendam propriedades da interação.
11.12 Status, , e precondições
Códigos de status classificam o resultado da tentativa de processar a requisição. Eles não substituem detalhes de domínio, mas fornecem uma primeira camada interoperável. 2xx indica processamento bem-sucedido; 3xx orienta redirecionamento ou reutilização; 4xx indica que a requisição não pode ser atendida nas condições apresentadas; 5xx aponta falha do servidor ou de um intermediário. A escolha deve refletir quem produziu a resposta e o estado observado.
ampliam a semântica. Location identifica o criado ou a localização relevante; representa uma versão da ; If-Match e If-None-Match expressam precondições; -Control controla reutilização; -After orienta nova tentativa; Allow informa métodos suportados; Vary descreve quais campos da requisição influenciam a resposta. Ignorar esses elementos reduz o nível 2 a uma tabela de verbos.
Precondições são especialmente importantes em corporativas. Dois consumidores podem ler a versão v7 de um e tentar atualizá-lo. Sem controle, a última escrita sobrescreve a anterior. Com e If-Match, o servidor executa a alteração apenas se a versão ainda corresponde. Se o estado mudou, retorna 412 Precondition Failed, permitindo que o cliente recarregue e reconcilie.
Tabela 4 - Elementos do protocolo que tornam a interface mais operável.
Elemento HTTP
Uso no nível 2
Falha comum
201 + Location
Confirma criação e informa identificador
Retornar 200 sem referência ao novo recurso
202 + monitor
Aceita processo ainda não concluído
Tratar aceitação como sucesso final
ETag / If-Match
Evita perda de atualização
Gerar ETag sem validar precondições
Cache-Control
Define reutilização e revalidação
Cachear resposta sensível sem política explícita
Retry-After
Orienta nova tentativa
Responder 429/503 sem janela ou estratégia
11.13 , e erros
significa que repetir a mesma requisição produz o mesmo efeito pretendido no servidor, embora a da resposta possa variar. e são definidos como idempotentes; não recebe essa garantia por padrão. Em sistemas distribuídos, não prova que a operação falhou. O cliente pode perder a resposta depois de o servidor concluir o comando, criando risco de duplicação.
Para operações não idempotentes, uma chave de pode associar tentativas equivalentes a um único resultado. O servidor precisa definir escopo, expiração, comparação de , persistência e comportamento concorrente. O pode exigir o e limitar formato, mas a deduplicação de negócio geralmente pertence ao serviço que conhece a operação e sua transação.
Erros devem combinar status e uma estável. , definido atualmente pela 9457, fornece campos como type, title, status, detail e instance, além de extensões. O status classifica o resultado; o type identifica uma categoria de problema; extensões carregam dados estruturados. Mensagens internas, stack e dados sensíveis não devem ser expostos.
Erro estruturado no nível 2
HTTP/1.1 409 Conflict
Content-Type: application/problem+json
{
"type": "https://api.exemplo/problemas/estado-invalido",
"title": "Transição não permitida",
"status": 409,
"detail": "A transferência já foi liquidada.",
"instance": "/transferencias/abc"
}
não é apenas configuração de cliente A estratégia depende de método, , fase da falha e capacidade de deduplicação. Repetir automaticamente um financeiro após sem chave de pode duplicar efeitos.
11.14 Nível 2 em
se beneficiam diretamente da semântica do nível 2. Políticas podem separar leitura e escrita por método, aplicar quotas por operação, bloquear métodos não publicados, validar Content-Type e Accept, propagar correlation IDs, produzir 405 quando o método não é permitido e normalizar erros de infraestrutura. Métricas por route template e status tornam-se mais representativas.
O , contudo, não transforma uma em nível 2 apenas reescrevendo caminhos ou métodos. Se recebe e chama internamente um comando que altera estado, a propriedade de segurança foi violada. Se converte todo erro do em 200, destrói semântica. Se adiciona sem garantir que a versão represente o estado, cria uma precondição falsa. A responsabilidade precisa ser compartilhada com o serviço.
Em arquiteturas com múltiplos saltos, deve-se registrar onde cada resposta foi criada. Um 429 pode vir do por quota, um 503 do balanceador, um 409 do domínio e um 401 do provedor de identidade. Padronização ajuda o consumidor, mas e de correlação precisam preservar a origem para .
Figura 5 - O reforça a interface e aplica políticas transversais; a semântica do domínio continua pertencendo à .
Tabela 5 - Uso do nível 2 em políticas de gateway.
Política
Responsabilidade adequada
Antipadrão
Autenticação
Validar credencial e contexto
Inventar autorização fina sem dados do domínio
Roteamento
Mapear contrato para upstream
Mascarar rotas incompatíveis sem observabilidade
Rate limiting
Proteger capacidade e planos
Usar o mesmo limite para leitura leve e comando caro
Validação
Rejeitar forma inválida do contrato
Aceitar payload e alterar silenciosamente significado
Transformação de erro
Normalizar infraestrutura e formato
Converter todos os erros em 200 ou 500
11.15 Nível 3: controles de
O nível 3 acrescenta controles de às representações. Além de retornar dados, o servidor informa relações e transições disponíveis no estado atual. Uma transferência pendente pode oferecer links self, confirm e cancel; uma transferência liquidada pode oferecer apenas self e receipt. O cliente não precisa construir todas as nem manter uma tabela completa de estados para saber quais ações estão habilitadas.
Essa abordagem se relaciona ao princípio : hypermedia as the engine of application state. “Estado da aplicação” refere-se ao progresso do cliente por uma sequência de interações, guiado por controles recebidos. O servidor continua controlando o estado dos recursos, enquanto a descreve caminhos possíveis. A Web funciona dessa forma quando um navegador recebe links e formulários.
Figura 6 - A de uma transferência pendente expõe somente as transições permitidas naquele momento.
Um link útil possui destino e relação semântica. A relação self indica a identificação canônica da ; next e prev podem navegar páginas; collection aponta à coleção; item relaciona coleção e membro. Relações registradas no permitem significado compartilhado, enquanto relações específicas podem usar próprias. O nome do campo sozinho não deve ser a única definição semântica.
Ações exigem mais informação que um href. O cliente pode precisar de método, tipo de conteúdo, campos, restrições e documentação. Diferentes formatos de representam essas informações de formas distintas. Não existe um único formato obrigatório para ; o contrato deve definir o tipo de mídia, as relações e como interpretar controles.
Controles precisam refletir autorização e estado, mas sua ausência não substitui enforcement. O servidor deve validar novamente toda ação. Um cliente pode fabricar uma requisição ou reutilizar um link antigo. A orienta a experiência e reduz tentativas inválidas; autorização e validação continuam obrigatórias.
Tabela 6 - Relações devem possuir significado estável e documentado.
Relação
Significado possível
Observação
self
Identificador da representação atual
Ajuda cache, correlação e atualização
collection
Coleção à qual o item pertence
Pode orientar navegação e criação
next / prev
Paginação ou sequência
Prefira links completos a reconstrução de cursor
confirm
Transição de domínio específica
Defina relação por URI ou contrato de mídia
describedby
Documento que descreve o recurso
Não substitui controles executáveis
11.17 Tipos de mídia e contratos de
depende de uma convenção que o cliente compreenda. application/ , isoladamente, define apenas a sintaxe ; não informa que _links contém relações, que actions descreve formulários ou como templates devem ser expandidos. A pode adotar um tipo de mídia conhecido, um perfil ou um tipo específico da organização. O importante é que o significado seja explícito e versionável.
Tipos de mídia específicos podem permitir evolução independente de , mas também aumentam governança e tooling. SDKs, validadores, e documentação precisam conhecer o formato. Em organizações com muitas equipes, uma especificação interna de deve definir campos obrigatórios, relações registradas, templates, ações, erros, compatibilidade e regras de segurança.
, definido pela 8288, permite transportar links em e representações. Templates, definidos pela 6570, permitem descrever destinos parametrizados. Esses padrões podem compor uma solução, mas não fornecem sozinhos um modelo completo de ações. A escolha deve considerar capacidades reais dos consumidores.
não possui por padrão Um campo chamado links é apenas dados até que o contrato defina relações, destinos, cardinalidade, templates e comportamento do cliente. A maturidade está na semântica compartilhada, não no nome do objeto.
11.18 Clientes orientados por transições
Um cliente orientado por inicia por um pequeno conjunto de pontos conhecidos e navega por relações. Ele procura rel=confirm, em vez de concatenar /confirmacao; interpreta uma ação disponível, em vez de codificar que PENDENTE sempre permite confirmação. Isso reduz acoplamento a topologia e parte das regras de fluxo.
A redução não é absoluta. O cliente ainda conhece relações, tipos de mídia e semântica do domínio. Alterar o significado de confirm é breaking change. Remover uma relação pode alterar funcionalidade. desloca o acoplamento de e sequências rígidas para vocabulários e affordances, que precisam de governança.
Clientes gerados exclusivamente a partir de tendem a chamar operações estáticas. Para explorar nível 3, o runtime precisa analisar representações e escolher transições. É possível combinar as abordagens: descreve operações e , enquanto relações nas respostas orientam disponibilidade e navegação. Testes devem verificar ambos.
Pseudocódigo de cliente guiado por relações
transfer = GET(entrypoint).follow("transfer-by-id", id="abc")
if transfer.has_relation("confirm"):
result = transfer.follow("confirm", body={"otp": "..."})
else:
show_message("A confirmação não está disponível no estado atual")
11.19 Benefícios, custos e armadilhas do nível 3
O principal benefício é permitir que o servidor comunique transições válidas e altere certos destinos sem exigir que clientes reconstruam . Isso pode melhorar descoberta, reduzir chamadas inválidas, facilitar fluxos longos e tornar o estado mais explícito. Em domínios com máquinas de estado relevantes - onboarding, pagamentos, pedidos, aprovações - controles dinâmicos podem trazer valor concreto.
O custo aparece em design, documentação, bibliotecas e testes. A equipe precisa definir vocabulários de relações, representar ações, manter tipos de mídia e educar consumidores. Ferramentas corporativas são mais maduras para e SDKs estáticos do que para clientes genéricos. Se os consumidores ignoram links e continuam concatenando caminhos, o custo é pago sem obter o benefício.
Uma armadilha comum é devolver todos os links possíveis, independentemente de estado ou autorização. Isso transforma em catálogo estático e pode expor informações desnecessárias. Outra é usar relações sem definição, como action1 ou execute. Também é inadequado acreditar que links eliminam versionamento: , relações e semântica continuam evoluindo.
Tabela 7 - A decisão de adotar hipermídia depende do domínio e do ecossistema.
Situação
Nível 3 tende a ajudar
Nível 3 pode não compensar
Fluxo de negócio
Múltiplos estados e transições dinâmicas
CRUD simples e estável
Consumidores
Clientes capazes de interpretar relações
Integrações batch rígidas e SDKs gerados
Topologia
Destinos e ações evoluem com frequência
Poucas operações e URLs estáveis
Governança
Vocabulário e tipo de mídia compartilhados
Cada equipe inventa formato próprio
Operação
Telemetria de relações e transições
Links não são observados nem testados
11.20 versus de Fielding
O é uma decomposição didática de alguns elementos; é um estilo arquitetural composto por restrições. O nível 1 se relaciona à identificação de recursos. O nível 2 aproxima-se da interface uniforme e do uso de . O nível 3 enfatiza controles de . Entretanto, o modelo não possui degraus explícitos para cliente-servidor, , , sistema em camadas e código sob demanda.
Uma pode estar no nível 3 e ainda depender de afinidade de sessão em uma instância, desabilitar em todas as respostas, expor detalhes de persistência e exigir coordenação simultânea entre cliente e servidor a cada mudança. Nessa situação, a interface utiliza , mas a arquitetura não obtém várias propriedades esperadas de .
O inverso também exige nuance. Uma no nível 2 pode aplicar cliente-servidor, , e camadas de forma robusta, ficando distante apenas do uso pleno de . Chamá-la de “imatura” sem considerar contexto pode ser menos útil que registrar exatamente quais restrições e propriedades estão presentes.
Tabela 8 - RMM e REST respondem a perguntas relacionadas, porém diferentes.
Aspecto
Richardson Maturity Model
REST de Fielding
Finalidade
Classificar capacidades visíveis da interface
Definir estilo arquitetural e propriedades emergentes
Estrutura
Quatro níveis cumulativos
Conjunto de restrições combinadas
Foco
Recursos, HTTP e hipermídia
Componentes, conectores, dados e restrições
Resultado
Linguagem de avaliação e evolução
Análise de propriedades arquiteturais
Limite
Não mede qualidade total nem todas as restrições
Não prescreve um desenho único de endpoints
11.21 , e governança
descreve operações , parâmetros, , respostas e mecanismos de segurança. Ele é excelente para design de contrato, documentação, geração de clientes, mocking e testes. Contudo, uma descrição válida pode representar qualquer nível: um único com campo operation, vários recursos ainda tratados por , uma interface de nível 2 ou operações cujas respostas incluem .
A governança pode utilizar regras automáticas para detectar sinais dos níveis: concentração excessiva de , verbos em caminhos, ausência de respostas 4xx, criação sem Location, métodos incompatíveis com segurança, falta de de erro e operações sem tags de . Essas regras são heurísticas. A semântica real, o comportamento idempotente e a qualidade das relações exigem revisão humana e testes.
Em corporativos, a análise deve combinar lint do contrato, testes de contrato, testes de comportamento e telemetria. O informa o que foi declarado; testes verificam o que o runtime executa; o mostra como consumidores realmente usam a interface. Uma pode documentar e implementar efeito não idempotente; apenas o comportamento revela a divergência.
Contrato não é comportamento pode declarar métodos e respostas corretos enquanto a implementação retorna 200 para todos os erros ou altera estado em . Maturidade precisa ser verificada por testes e evidências operacionais.
11.22 Matriz de avaliação
Uma avaliação útil evita reduzir a interface a uma nota. Para cada jornada, registre evidência, impacto e ação recomendada. O nível pode ser informado, mas deve vir acompanhado de observações sobre , segurança e operação. A tabela a seguir fornece perguntas mínimas que podem ser aplicadas a uma ou conjunto de .
A equipe também deve considerar peso e contexto. A ausência de pode ter baixo impacto em uma interna com dois consumidores estáveis, enquanto não idempotente sem deduplicação pode representar risco crítico. Prioridade de melhoria deve ser determinada por risco e valor, não apenas pela distância até o nível 3.
Tabela 9 - Matriz de avaliação baseada em evidências.
Dimensão
Pergunta de evidência
Indício
Endpoint
As intenções convergem em um único URI genérico?
Nível 0
Recursos
Entidades e processos possuem identidade estável?
Nível 1
Métodos
GET, POST, PUT, PATCH e DELETE respeitam semântica?
Nível 2
Respostas
Status e headers permitem interpretação genérica?
Nível 2
Hipermídia
Representações expõem relações e transições atuais?
Nível 3
Stateless
A requisição depende de sessão local anterior?
Restrição REST
Cache
Respostas reutilizáveis possuem política explícita?
Restrição REST
Camadas
O cliente depende da topologia interna?
Restrição REST
Operação
Logs distinguem gateway, API e domínio?
Qualidade operacional
Exemplo de conclusão de avaliação
Jornada: consulta e cancelamento de agendamento. Evidência: recursos identificados por /agendamentos/{id}; leitura usa ; cancelamento usa /cancelar; erros usam 200 com envelope. Classificação: nível 1 com elementos parciais de nível 2. Risco: observabilidade e tratamento de inconsistentes. Próxima ação: adotar ou de cancelamento conforme semântica do domínio, status e , mantendo rota antiga durante migração.
11.23 Estratégia de migração
Migração deve começar por uma jornada de valor e não pela reescrita total do catálogo. Selecione operações com alto custo de suporte, risco de duplicação ou dificuldade de evolução. Inventarie consumidores, volumes, dependências de , códigos internos e políticas do . Defina métricas de sucesso antes de publicar a nova interface.
A nova superfície pode coexistir com a antiga. Um adaptador traduz mensagens do nível 0 para recursos e métodos do nível 2; respostas antigas são preservadas para clientes legados. Contratos possuem datas, políticas de depreciação e telemetria de uso. Mudanças irreversíveis só ocorrem após evidência de migração.
deve ser adicionada quando existe um caso de uso. Começar por links self, next, prev e relações de processo permite testar tooling e consumidores. Ações dinâmicas podem ser introduzidas em fluxos com estados relevantes. A equipe evita criar um amplo antes de demonstrar benefício.
Figura 7 - A evolução entre níveis pode ser incremental, compatível e orientada por risco.
11.24 Observabilidade e
A maturidade da interface altera a qualidade dos sinais operacionais. No nível 0, métricas por /servico agregam todas as intenções; é necessário extrair operation do ou adicionar atributo de negócio. No nível 1, rotas distinguem recursos, mas ações podem continuar escondidas. No nível 2, método, route template e status oferecem dimensões padronizadas. No nível 3, relações seguidas podem revelar transições e jornadas.
devem registrar método, route template, status, latência, origem da resposta, correlation ID, consumidor e identificador do quando permitido. Evite usar a concreta como label de métrica, pois IDs de alta cardinalidade degradam sistemas de observabilidade. Use /transferencias/{id} como dimensão e preserve o identificador apenas em ou protegidos.
precisa separar contrato e transporte. Um ocorre antes de qualquer classificação ; um 405 indica que um componente respondeu; um 409 pode representar conflito de domínio; um 200 com erro interno sugere contrato de nível 0 ou adaptação inadequada. Em , confirme se a resposta foi produzida pelo , pela política ou pelo .
Tabela 10 - Sintomas úteis na investigação de interfaces em diferentes níveis.
Sintoma
Hipótese
Evidência a coletar
Tudo aparece como uma rota
Endpoint genérico de nível 0
campo operation, política de extração e trace
GET altera estado
Semântica de nível 2 violada
logs de domínio e testes repetidos
Retry duplica operação
POST sem deduplicação
idempotency key e registros transacionais
Link existe mas falha
Controle desatualizado ou sem autorização
representação, estado e decisão de autorização
405 no gateway
Método bloqueado ou não publicado
Allow, configuração de rota e upstream
200 com problema
Envelope legado ou transformação
body, policy chain e status do backend
11.25 Estudos de caso e laboratórios
Os exercícios a seguir utilizam um domínio fictício de transferências. Execute apenas em ambientes de laboratório ou mocks. O objetivo é observar diferenças de contrato e comportamento; não é reproduzir dados ou integrações reais.
Estudo de caso 1 - modernização de dispatcher
Uma recebe /transacoes com action=CONSULTAR, action=CRIAR e action=CANCELAR. Todos os resultados usam 200. Proponha recursos, métodos e respostas. Considere como preservar consumidores antigos, como correlacionar a nova transferência e como tratar após criação. Compare métricas antes e depois.
Estudo de caso 2 - processo assíncrono
Uma transferência pode permanecer em análise. Modele a solicitação como , retorne 202 quando o processamento ainda não terminou e forneça um monitor. Depois acrescente relações self, cancel e receipt conforme o estado. Verifique que o servidor rejeita ações não autorizadas mesmo quando o link é fabricado.
Laboratório 1 - classificação por evidência
Liste todos os de uma de teste e agrupe por jornada.
Identifique operações concentradas em ou verbos no caminho.
Classifique cada jornada, não apenas a inteira.
Registre evidências de recursos, métodos, status, e .
Produza recomendações priorizadas por risco e valor.
Laboratório 2 - teste de
Execute repetidamente e confirme que não há efeito solicitado sobre o domínio.
Repita e e observe o efeito pretendido.
Simule atualização concorrente com e If-Match.
Provoque validação, conflito, ausência e indisponibilidade; compare status e .
Inspecione e para descobrir qual componente produziu cada resposta.
Laboratório 3 - cliente de
Inicie por um entry point e procure relações, sem concatenar caminhos.
Execute apenas ações presentes na .
Altere o destino de uma relação no servidor sem modificar o cliente.
Remova uma transição por mudança de estado e observe o comportamento.
Capture métricas de relações seguidas e falhas de transição.
Resumo do capítulo
O descreve uma evolução em quatro níveis. O nível 0 concentra operações em mensagens enviadas a um genérico. O nível 1 introduz recursos e identificadores. O nível 2 utiliza a semântica do por meio de métodos, status, , e precondições. O nível 3 acrescenta controles de que orientam transições no estado atual.
O modelo é útil para diagnóstico e planejamento, mas não mede todos os atributos de uma plataforma. Segurança, confiabilidade, governança, desempenho, documentação e compatibilidade exigem análises próprias. Ele também não substitui as restrições de descritas por Fielding. Uma interface pode atingir o nível 3 sem obter todas as propriedades arquiteturais do estilo.
A evolução deve ser orientada por risco e valor. Recursos estáveis melhoram identidade; melhora interoperabilidade e operação; pode reduzir acoplamento a e regras de fluxo. Cada passo possui custos e depende do ecossistema de consumidores. O objetivo não é alcançar uma pontuação, mas construir interfaces previsíveis, evolutivas e observáveis.
Checklist de avaliação
As operações estão concentradas em um e diferenciadas pelo ?
Os conceitos do domínio possuem recursos e identificadores estáveis?
representam recursos em vez de nomes de funções?
Métodos respeitam segurança e ?
Códigos de status identificam corretamente sucesso, erro do cliente e falha do servidor?
Criações, processos assíncronos e precondições usam apropriados?
Erros possuem formato estruturado e não expõem dados sensíveis?
consideram e deduplicação?
Representações expõem links e ações com relações definidas?
Clientes realmente interpretam as relações ou continuam codificando ?
A avaliação separa , restrições e atributos de qualidade?
, e domínio preservam a mesma semântica?
Métricas usam route templates e distinguem origem da resposta?
A migração possui inventário de consumidores, telemetria e plano de depreciação?
Exercícios de revisão
Explique por que usar e não determina o nível de uma .
Classifique uma interface com vários caminhos, todos tratados por , e justifique.
Modele consulta, criação e cancelamento de transferências nos níveis 0, 1 e 2.
Descreva uma situação em que uma de nível 2 seja adequada e nível 3 não compense.
Explique como e If-Match contribuem para uma interface de nível 2.
Proponha relações de para um processo de aprovação com quatro estados.
Diferencie ausência de link e falta de autorização no servidor.
Compare o com as restrições e de .
Explique por que não certifica comportamento idempotente.
Crie um plano de migração para um único usado por cinco consumidores.
Descreva um roteiro de para 200 contendo erro interno.
Elabore uma matriz de evidências para avaliar uma no e no .
Glossário
Glossário essencial do capítulo.
Termo
Definição
Affordance
Indicação de uma ação possível e de como executá-la no contexto de uma representação.
Endpoint
Ponto de interação exposto por uma API, normalmente associado a URI e método.
HATEOAS
Uso de hipermídia para orientar o estado da aplicação e as próximas transições.
Hipermídia
Mídia que contém controles, relações ou links capazes de orientar navegação e ações.
Idempotência
Propriedade pela qual repetições equivalentes produzem o mesmo efeito pretendido.
Link relation
Relação que define o significado de um link entre o contexto e o destino.
POX
Plain Old XML; no RMM, representa mensagens proprietárias transportadas por um endpoint genérico, mesmo quando o formato moderno é JSON.
Problem Details
Formato padronizado para representar detalhes de problemas em APIs HTTP.
Recurso
Abstração identificável que pode possuir representações e estado controlado pelo servidor.
Representação
Dados transferidos que descrevem o estado atual ou pretendido de um recurso.
Richardson Maturity Model
Modelo de quatro níveis para observar adoção de recursos, semântica HTTP e hipermídia.
RMM
Sigla de Richardson Maturity Model.
Semântica HTTP
Significado compartilhado de métodos, códigos, headers e outros elementos do protocolo.
URI Template
Sintaxe para expressar URIs parametrizadas que podem ser expandidas por clientes.
Web Linking
Modelo padronizado para expressar links e relações em mensagens web.
Referências técnicas
As referências abaixo devem ser lidas em conjunto. O artigo de Fowler apresenta o modelo; a dissertação de Fielding fornece a base arquitetural de ; as definem a semântica interoperável utilizada nos exemplos.
[1] FOWLER, Martin. : steps toward the glory of . 2010. Disponível em: martinfowler.com/articles/richardsonMaturityModel. .
[2] FIELDING, Roy Thomas. Architectural Styles and the Design of Network-based Software Architectures. University of California, Irvine, 2000. Capítulo 5: Representational State Transfer.
[3] . 9110 - Semantics. 2022.
[4] . 9111 - . 2022.
[5] . 8288 - . 2017.
[6] . 6570 - . 2012.
[7] . 9457 - for . 2023.
[8] . Link Relations Registry. Registro de relações padronizadas para links.
[9] Initiative. Specification. Especificação para descrição de .
[12] . 7232 - Hypertext Transfer Protocol ( /1.1): Conditional . 2014. Obsoleta como documento agregado, mas historicamente relevante; a semântica atual está consolidada na 9110.
Encerramento do capítulo O próximo passo do curso é aprofundar a descrição e governança de contratos de , conectando modelagem , , validação, compatibilidade e automação de .