RFC 10008: O novo método HTTP QUERY
Propósito e Semântica de QUERY
- Introduz
QUERYcomo “GET com corpo”: somente leitura, seguro e idempotente. - O objetivo principal é suportar consultas complexas/grandes (por exemplo, GraphQL, filtros ricos, imagens) sem limites de tamanho de URL.
- Destinado apenas à recuperação de dados; a semântica é semelhante à de GET, mas os parâmetros da requisição ficam no corpo.
Cache, Idempotência e Segurança
- Como QUERY é seguro e idempotente, intermediários e clientes podem armazená-lo em cache e tentar novamente automaticamente, ao contrário de POST.
- Debate sobre chaves de cache:
- Preocupação: usar o corpo inteiro como chave de cache cria chaves ilimitadas, controladas pelo usuário, e complexidade (ordenação, normalização, hashing).
- Contra-argumentos: isso é opcional; caches podem fazer hash do corpo, ou, melhor, servidores podem responder com uma URL curta
Locationque então pode ser armazenada em cache via GET.
- Efeitos colaterais como logging e quotas são tratados como “ignorados” no nível da semântica HTTP, da mesma forma que em GET.
GET-com-corpo vs Novo Método
- Alguns argumentam que a especificação deveria apenas padronizar um corpo em GET.
- Outros observam que muitos proxies/servidores ignoram, descartam ou rejeitam corpos em GET, e isso já é desencorajado há muito tempo, então adaptar semântica é inseguro.
- O novo método evita alteração silenciosa: QUERY não suportado tende a falhar claramente (por exemplo, 405) em vez de descartar dados.
Intermediários e Compatibilidade
- Preocupação: muitas caixas intermediárias historicamente lidam mal com métodos desconhecidos ou com qualquer método-com-corpo que não entendam.
- Sem suporte amplo de gateways/CDNs, POST com cabeçalhos personalizados continua sendo a escolha pragmática para alguns.
- QUERY também precisa lidar com CORS: atualmente não está na safelist, então os navegadores fazem preflight, mesmo sendo seguro.
Casos de Uso e Reações de Desenvolvedores
- Usos sugeridos: consultas grandes de GraphQL, filtros de busca complexos, padrões dry-run vs commit (QUERY depois POST), consultas semelhantes às de banco de dados, consultas de IA em streaming com event streams.
- Alguns veem isso como uma correção semântica limpa para gambiarras de “POST /search” e um melhor alinhamento com o modelo de métodos do HTTP.
- Céticos veem como excesso: mais complexidade, novo plumbing e mais uma nuance que desenvolvedores precisam aprender, para um problema já “bom o suficiente” com GET/POST.
Formulários HTML, Favoritos e UX
- Há interesse em
method="query"em formulários HTML para evitar avisos de “reenviar dados de POST” e mapear melhor operações seguras. - Desejo mais amplo de permitir que formulários usem mais verbos HTTP (PUT/DELETE/etc.) para alinhar interações humanas com a semântica REST.
- Preocupação com a possibilidade de salvar nos favoritos se os parâmetros de consulta ficarem no corpo; discutem-se mitigações via URLs GET geradas pelo servidor.
Debates de Nome e Conceito
- Alguns acham “QUERY” confuso, dada a terminologia existente de “query string”.
- Alguns argumentam que verbos HTTP não deveriam codificar semântica de negócio, vendo isso como sobreprojeto impulsionado por REST; outros respondem que o HTTP sempre associou semântica aos métodos.