1

HTTP QUERY: o que muda para quem usa POST em buscas

Você começa com GET /products?category=laptops. Depois precisa filtrar por várias marcas, combinar condições e enviar intervalos de preço. Representar aquilo num JSON fica mais simples, então é criado o POST /products/search.

Uma escolha razoável. POST pede que o servidor processe o conteúdo recebido conforme as regras daquele recurso. A tabelinha "GET lê, POST cria" ajuda a começar, mas simplifica demais o protocolo. Uma busca cabe perfeitamente na definição de POST.

O QUERY, definido na RFC 10008, publicada em junho de 2026, atende esse caso com um contrato mais específico: enviar uma consulta no body, com semântica segura e idempotente.

Num exemplo simplificado, a mudança fica assim:

- POST /products/search HTTP/1.1
+ QUERY /products/search HTTP/1.1
  Host: api.example.com
  Content-Type: application/json

  {
    "category": "laptops",
    "price": { "max": 5000 },
    "brands": ["dell", "lenovo"],
    "sort": "-rating"
  }

Você vai sentir a diferença quando a conexão falha

Imagine que o servidor recebeu a busca, mas a conexão caiu antes de a resposta chegar. O cliente precisa decidir se tenta de novo.

Com POST, um cliente genérico precisa conhecer o comportamento daquele endpoint para repetir a chamada com segurança. Com QUERY, essa garantia faz parte do método: ele pode reenviar a consulta após uma falha de comunicação, mesmo que a primeira tentativa tenha sido processada.

Aqui, "seguro" significa que a operação não solicita alterações no estado do servidor. Já a idempotência diz que repetir a mesma requisição tem o mesmo efeito solicitado que executá-la uma vez. O preço do notebook pode mudar entre duas buscas e produzir respostas diferentes. Isso não quebra a idempotência.

Por isso, eu revisaria o handler antes de trocar o método no roteador. Se essa "busca" também reserva estoque, existe uma alteração de estado fazendo parte da operação. Chamar aquilo de QUERY seria prometer um comportamento que o código não entrega.

O cache precisa considerar o body

Respostas de QUERY podem ser armazenadas em cache. A chave, porém, precisa incorporar o conteúdo da requisição e os metadados relevantes para interpretá-lo. Duas chamadas para /products/search, uma buscando Dell e outra Lenovo, precisam ser diferenciadas. Usar a mesma URL não torna essas consultas equivalentes, e trocar o método não configura o cache automaticamente.

Mandar esse JSON num GET também não resolve bem: o body de GET não tem semântica geral definida pelo HTTP e pode levar algumas implementações a rejeitar a requisição. Depender desse comportamento exige cuidados com os intermediários no caminho.

E agora o que fazer, usar ou não usar?

Não abriria uma migração de API só para substituir POST por QUERY. Numa busca avançada nova, experimentaria o método e manteria o POST disponível para os consumidores que ainda dependem dele.

Antes de adotar, testaria a requisição passando pelo ambiente de verdade, incluindo o proxy e as regras de segurança. Meu critério seria o funcionamento desse caminho completo, não apenas conseguir registrar uma rota no framework.

No navegador, chamadas entre origens com QUERY exigem preflight de CORS, e a configuração precisa permitir o método. Tem um detalhe nessa comparação: o POST com Content-Type: application/json do exemplo também exige preflight entre origens. Esse custo não é exclusivo do QUERY.

Para filtros que cabem bem na URL, continuaria usando GET. Vejo utilidade no QUERY quando a consulta pede um body e faz sentido comunicar, pelo próprio protocolo, que aquela operação pode ser repetida com segurança. Numa API existente, pesaria isso contra o trabalho de atualizar os consumidores.

Alguém já testou QUERY com o proxy e as regras de segurança de produção no caminho? Queria saber quais adaptações foram necessárias além de registrar a rota.

Carregando publicação patrocinada...