Modelo de Maturidade REST de Richardson
Voltar para Learn
FAACCapítulo 11

Fundamentos e Arquitetura de APIs Corporativas

Modelo de Maturidade REST de Richardson

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

Evolução em quatro estágios do modelo de maturidade REST de Richardson, do endpoint único à hipermídia

Evolução da interface segundo o

Evolução da interface pelos quatro níveis do Richardson Maturity Model
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

Os quatro níveis cumulativos do Richardson Maturity Model
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ívelElemento acrescentadoConhecimento principal do clienteRisco característico
0Mensagens sobre um endpointOperações e formato proprietárioDispatcher central, pouca semântica compartilhada
1Recursos e identificadoresQuais recursos existem e como endereçá-losRecursos tratados apenas como envelopes de comandos
2Métodos, status e headers HTTPSemântica do protocolo e contrato do recursoUso decorativo de verbos ou códigos inconsistentes
3Controles de hipermídiaRelações e tipos de mídiaLinks 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.

Várias intenções convergindo para um endpoint e um dispatcher no nível 0
Figura 2 - No nível 0, o protocolo transporta uma mensagem proprietária e o corpo concentra a intenção da operação.

Exemplo conceitual de mensagem no nível 0

POST /servico-pagamentos HTTP/1.1
Content-Type: application/json
{
  "operation": "CRIAR_TRANSFERENCIA",
  "contaOrigem": "991",
  "contaDestino": "552",
  "valor": 120.00
}

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.
SintomaImpacto no gatewayImpacto no consumidor
Um URI para tudoPolíticas dependem de inspeção do bodySDK precisa conhecer dispatcher e códigos internos
200 para sucesso e erroMétricas por status ficam enganosasTratamento de erro depende do envelope
POST para leitura e escritaCache e segurança não podem inferir intençãoRetry exige regra específica por operação
Contrato central extensoMudanças afetam grande superfícieVersionamento 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.

Recursos distintos com identidade e escopo visíveis no nível 1
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ãoPergunta técnicaExemplo
IdentidadeO recurso precisa ser referenciado depois?/transferencias/{id}
EscopoA identidade é global ou subordinada?/contas/{conta}/agendamentos/{id}
GranularidadeQuais dados mudam e são autorizados juntos?preferências separadas do cadastro
Ciclo de vidaQuais estados e transições existem?PENDENTE -> CONFIRMADA -> LIQUIDADA
PermanênciaO 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.

Métodos e respostas HTTP carregando semântica compartilhada no nível 2
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.

Atualização protegida por precondição

PUT /preferencias/cliente-483 HTTP/1.1
Content-Type: application/json
If-Match: "v7"
{ "idioma": "pt-BR", "notificacoes": true }
HTTP/1.1 412 Precondition Failed
Content-Type: application/problem+json
Tabela 4 - Elementos do protocolo que tornam a interface mais operável.
Elemento HTTPUso no nível 2Falha comum
201 + LocationConfirma criação e informa identificadorRetornar 200 sem referência ao novo recurso
202 + monitorAceita processo ainda não concluídoTratar aceitação como sucesso final
ETag / If-MatchEvita perda de atualizaçãoGerar ETag sem validar precondições
Cache-ControlDefine reutilização e revalidaçãoCachear resposta sensível sem política explícita
Retry-AfterOrienta nova tentativaResponder 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 .

API Gateway reforçando políticas sem substituir a semântica do domínio
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íticaResponsabilidade adequadaAntipadrão
AutenticaçãoValidar credencial e contextoInventar autorização fina sem dados do domínio
RoteamentoMapear contrato para upstreamMascarar rotas incompatíveis sem observabilidade
Rate limitingProteger capacidade e planosUsar o mesmo limite para leitura leve e comando caro
ValidaçãoRejeitar forma inválida do contratoAceitar payload e alterar silenciosamente significado
Transformação de erroNormalizar infraestrutura e formatoConverter 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.

Controles de hipermídia expondo as transições permitidas para uma transferência
Figura 6 - A de uma transferência pendente expõe somente as transições permitidas naquele momento.

conceitual com controles de

{
  "id": "abc",
  "status": "PENDENTE",
  "valor": 120.00,
  "_links": {
    "self":    { "href": "/transferencias/abc" },
    "confirm": { "href": "/transferencias/abc/confirmacao", "method": "POST" },
    "cancel":  { "href": "/transferencias/abc/cancelamento", "method": "POST" }
  }
}

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çãoSignificado possívelObservação
selfIdentificador da representação atualAjuda cache, correlação e atualização
collectionColeção à qual o item pertencePode orientar navegação e criação
next / prevPaginação ou sequênciaPrefira links completos a reconstrução de cursor
confirmTransição de domínio específicaDefina relação por URI ou contrato de mídia
describedbyDocumento que descreve o recursoNã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çãoNível 3 tende a ajudarNível 3 pode não compensar
Fluxo de negócioMúltiplos estados e transições dinâmicasCRUD simples e estável
ConsumidoresClientes capazes de interpretar relaçõesIntegrações batch rígidas e SDKs gerados
TopologiaDestinos e ações evoluem com frequênciaPoucas operações e URLs estáveis
GovernançaVocabulário e tipo de mídia compartilhadosCada equipe inventa formato próprio
OperaçãoTelemetria de relações e transiçõesLinks 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.
AspectoRichardson Maturity ModelREST de Fielding
FinalidadeClassificar capacidades visíveis da interfaceDefinir estilo arquitetural e propriedades emergentes
EstruturaQuatro níveis cumulativosConjunto de restrições combinadas
FocoRecursos, HTTP e hipermídiaComponentes, conectores, dados e restrições
ResultadoLinguagem de avaliação e evoluçãoAnálise de propriedades arquiteturais
LimiteNão mede qualidade total nem todas as restriçõesNã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ãoPergunta de evidênciaIndício
EndpointAs intenções convergem em um único URI genérico?Nível 0
RecursosEntidades e processos possuem identidade estável?Nível 1
MétodosGET, POST, PUT, PATCH e DELETE respeitam semântica?Nível 2
RespostasStatus e headers permitem interpretação genérica?Nível 2
HipermídiaRepresentações expõem relações e transições atuais?Nível 3
StatelessA requisição depende de sessão local anterior?Restrição REST
CacheRespostas reutilizáveis possuem política explícita?Restrição REST
CamadasO cliente depende da topologia interna?Restrição REST
OperaçãoLogs 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.

Roteiro incremental de migração orientado por risco e compatibilidade
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.
SintomaHipóteseEvidência a coletar
Tudo aparece como uma rotaEndpoint genérico de nível 0campo operation, política de extração e trace
GET altera estadoSemântica de nível 2 violadalogs de domínio e testes repetidos
Retry duplica operaçãoPOST sem deduplicaçãoidempotency key e registros transacionais
Link existe mas falhaControle desatualizado ou sem autorizaçãorepresentação, estado e decisão de autorização
405 no gatewayMétodo bloqueado ou não publicadoAllow, configuração de rota e upstream
200 com problemaEnvelope legado ou transformaçãobody, 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.
TermoDefinição
AffordanceIndicação de uma ação possível e de como executá-la no contexto de uma representação.
EndpointPonto de interação exposto por uma API, normalmente associado a URI e método.
HATEOASUso de hipermídia para orientar o estado da aplicação e as próximas transições.
HipermídiaMídia que contém controles, relações ou links capazes de orientar navegação e ações.
IdempotênciaPropriedade pela qual repetições equivalentes produzem o mesmo efeito pretendido.
Link relationRelação que define o significado de um link entre o contexto e o destino.
POXPlain Old XML; no RMM, representa mensagens proprietárias transportadas por um endpoint genérico, mesmo quando o formato moderno é JSON.
Problem DetailsFormato padronizado para representar detalhes de problemas em APIs HTTP.
RecursoAbstração identificável que pode possuir representações e estado controlado pelo servidor.
RepresentaçãoDados transferidos que descrevem o estado atual ou pretendido de um recurso.
Richardson Maturity ModelModelo de quatro níveis para observar adoção de recursos, semântica HTTP e hipermídia.
RMMSigla de Richardson Maturity Model.
Semântica HTTPSignificado compartilhado de métodos, códigos, headers e outros elementos do protocolo.
URI TemplateSintaxe para expressar URIs parametrizadas que podem ser expandidas por clientes.
Web LinkingModelo 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 .

[10] . 6902 - JavaScript Object Notation ( ) . 2013.

[11] . 7386 - Merge . 2014.

[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 .