QUERY llega a HTTP: el método que faltaba entre GET y POST

Durante años, muchas APIs han escondido búsquedas complejas detrás de un POST. No porque tuviera sentido semántico, sino porque era la salida práctica. Un GET funciona muy bien para lecturas simples, pero cuando una búsqueda necesita filtros anidados, arrays, rangos, ordenaciones múltiples o estructuras JSON, la URL deja de ser un sitio cómodo para meterlo todo. El resultado fue un patrón conocido por cualquier equipo de backend: endpoints de lectura con cuerpo de POST.

HTTP acaba de cubrir ese hueco con RFC 10008, que define el método QUERY como estándar propuesto de IETF. Su objetivo es claro: permitir una petición de consulta con body, como POST, pero manteniendo las propiedades que se esperan de una lectura: es segura, idempotente y cacheable.

No significa que mañana todos los frameworks, proxies, balanceadores, CDNs y WAFs lo soporten sin tocar nada. La adopción llevará tiempo. Pero para quienes diseñan APIs, mantienen infraestructura web o pelean con endpoints de búsqueda avanzada, QUERY marca una dirección bastante lógica: dejar de usar POST como contenedor genérico para lecturas complejas.

El problema real: GET se queda corto y POST miente un poco

GET es el método natural para pedir datos. Es seguro, idempotente y cacheable. Su problema aparece cuando la consulta deja de ser sencilla. Una URL puede llevar parámetros, pero no está pensada para transportar estructuras grandes o muy expresivas. Además, los límites reales no dependen solo del servidor. La petición puede pasar por navegadores, proxies, balanceadores, gateways, firewalls, CDNs y sistemas de observabilidad, cada uno con sus propias restricciones.

También hay otro detalle menos visible: la URL se registra en logs con mucha más facilidad que el cuerpo de una petición. Si se envían filtros sensibles en query string, pueden acabar en historiales, métricas, trazas, cabeceras de referencia o registros intermedios.

POST resolvía la parte física del problema porque acepta body. Se podía mandar un JSON limpio, con filtros bien estructurados, sin pelearse con encoding de URL. Pero a cambio se perdía semántica. Para un proxy, una CDN, un cliente HTTP o un sistema de reintentos, POST no comunica de forma nativa “esto es una lectura segura”. Puede ser una búsqueda, pero también puede crear un pedido, lanzar una tarea, enviar un formulario o modificar estado.

MétodoSeguroIdempotenteBodyCacheableUso natural
GETSin semántica definidaLecturas simples
QUERYConsultas complejas
POSTNo necesariamenteNo necesariamenteCondicionalCreación, acciones o procesos con efectos

En HTTP, “seguro” no significa cifrado, autenticado ni protegido frente a ataques. Significa que el cliente no pide cambiar el estado del recurso. Un GET o un QUERY pueden quedar registrados, consumir CPU o actualizar métricas, pero no deberían crear, modificar ni borrar datos como parte de su operación principal.

Qué aporta QUERY

QUERY permite enviar el contenido de la consulta en el body de la petición. Ese contenido puede ser JSON, SQL, JSONPath, formularios u otro tipo de medio que el servidor declare soportado. La semántica no la define solo el método, sino también el recurso y el Content-Type.

Un ejemplo simple podría ser:

QUERY /api/servidores/search HTTP/1.1
Host: ejemplo.com
Content-Type: application/json
Accept: application/json

{
  "where": {
    "region": ["mad1", "ams1"],
    "status": "active",
    "ram_gb": { "gte": 128 },
    "tags": ["proxmox", "production"]
  },
  "sort": [
    { "field": "created_at", "direction": "desc" }
  ],
  "limit": 50
}Lenguaje del código: JavaScript (javascript)

Esto antes solía acabar en algo como:

POST /api/servidores/search HTTP/1.1
Content-Type: application/jsonLenguaje del código: HTTP (http)

Funcionaba, pero el método no decía la verdad completa. QUERY sí la dice: el servidor va a procesar una consulta incluida en el body y devolver el resultado, sin que el cliente espere cambios de estado.

La RFC introduce también la cabecera Accept-Query, con la que un recurso puede indicar qué formatos acepta para consultas. Por ejemplo:

Accept-Query: application/json, application/jsonpath, application/sqlLenguaje del código: HTTP (http)

Esto permite descubrir capacidades sin depender solo de documentación externa. Un cliente podría preguntar primero con HEAD u OPTIONS, leer Accept-Query y decidir si manda un JSON, un formulario o una consulta en otro formato.

Ventajas para APIs, CDNs y reintentos

La primera ventaja es semántica. Un endpoint de búsqueda avanzada deja de camuflarse como POST. Esto ayuda al diseño de APIs, a los SDKs, a la documentación y a los equipos que operan infraestructura. La intención queda más clara desde el método HTTP.

La segunda ventaja es la idempotencia. Si una conexión cae a mitad de una petición QUERY, un cliente o intermediario puede repetirla sin miedo a duplicar una compra, crear dos registros o lanzar dos trabajos. Eso no elimina la necesidad de diseñar bien el backend, pero da una señal mucho más limpia a la cadena HTTP.

La tercera es la caché. QUERY está definido como cacheable. Eso abre una puerta importante para búsquedas pesadas que hoy se ejecutan una y otra vez porque llegaron como POST. La RFC exige que la clave de caché incorpore el contenido de la petición y metadatos relacionados. Es más complejo que cachear GET, pero por fin queda definido dentro del protocolo.

VentajaImpacto práctico
Body estructuradoFiltros complejos sin forzar la URL
Semántica de lecturaMejor diseño de APIs y contratos
IdempotenciaReintentos más seguros tras fallos
Caché HTTPPosible reutilización en proxies y CDNs
Menos exposición en URLMenos datos sensibles en logs de URI
Descubrimiento con Accept-QueryEl servidor puede anunciar formatos aceptados
Content-Location y LocationPosibilidad de convertir resultados o consultas en recursos GET

Una posibilidad interesante es que el servidor responda a una consulta QUERY con Location o Content-Location. Así puede asignar una URI a la consulta guardada o al resultado, y el cliente puede usar GET después. Es útil para informes pesados, búsquedas recurrentes o consultas que conviene materializar.

Desventajas y problemas de adopción

QUERY no es magia. El primer problema es el soporte real. Muchos servidores, proxies, CDNs, WAFs, librerías, middlewares y herramientas de monitorización están acostumbrados a GET, POST, PUT, PATCH y DELETE. Un método nuevo puede acabar bloqueado, no registrado correctamente, mal clasificado en métricas o tratado como tráfico sospechoso.

El segundo problema está en la caché. Sí, QUERY es cacheable, pero cachearlo bien exige que la infraestructura entienda el body. No basta con mirar la URL. Dos cuerpos JSON con el mismo significado, pero distinto orden de claves o espacios, podrían generar claves diferentes si no se normalizan. La RFC contempla esta complejidad, pero llevarlo a producción exigirá soporte serio por parte de CDNs y proxies.

El tercer punto está en CORS. En navegador, QUERY no entra dentro de los métodos “simples” de CORS, que se limitan a GET, HEAD y POST. En llamadas cross-origin habrá preflight con OPTIONS, y las APIs tendrán que responder con Access-Control-Allow-Methods: QUERY cuando corresponda.

Riesgo o limitaciónQué revisar
Soporte de servidoresNginx, Apache, Envoy, HAProxy, Node, Go, Java, .NET
CDNs y proxiesCaching por body, claves, normalización y purga
WAFsReglas que bloqueen métodos desconocidos
ObservabilidadLogs, métricas, trazas y dashboards
CORSPreflight y Access-Control-Allow-Methods
SDKsClientes generados desde OpenAPI u otras herramientas
Backward compatibilityFallback temporal a POST
SeguridadLímites de tamaño, validación y control de coste

También hay que recordar algo básico: poner filtros en el body no los convierte en secretos. Es mejor que exponerlos en la URL para ciertos casos, pero siguen viajando al servidor y pueden acabar en logs de aplicación, trazas, APM o dumps si no se controla bien. TLS, políticas de logging y minimización de datos siguen siendo obligatorios.

Cuándo usar GET, QUERY o POST

La regla práctica puede ser bastante sencilla. GET sigue siendo la mejor opción para lecturas simples, estables y fáciles de representar en una URL. Si una búsqueda cabe de forma natural en query string, no hace falta complicarla.

QUERY encaja cuando la operación es una lectura, pero la entrada necesita estructura. Es el caso de buscadores avanzados, filtros de inventario, analítica, reportes, consultas sobre logs, búsquedas vectoriales, GraphQL de solo lectura o endpoints de reporting con muchos parámetros.

POST debe quedarse para lo que realmente implica acción: crear recursos, enviar formularios, lanzar procesos, ejecutar comandos, cambiar estado, iniciar flujos o realizar operaciones que no son seguras. También puede seguir siendo el fallback durante años mientras el ecosistema adopta QUERY.

CasoMejor método
/users?status=active&page=2GET
Buscar servidores por tags, región, RAM y fechaQUERY
Consulta analítica con filtros anidadosQUERY
GraphQL query de solo lecturaQUERY, cuando haya soporte
Crear usuarioPOST
Lanzar backup bajo demandaPOST
Generar informe que modifica estado o consume cupo no repetiblePOST
Actualizar un recurso completoPUT
Modificar parte de un recursoPATCH

Para administradores de sistemas, la recomendación inicial no es abrir QUERY en producción sin más. Lo razonable es probar primero en entornos controlados: API interna, staging, gateway específico o endpoints nuevos donde se pueda medir cómo se comportan proxy, WAF, caché, APM y clientes.

Una guía mínima para empezar

Un diseño prudente podría seguir estos pasos:

PasoRecomendación
1Identificar endpoints POST que en realidad son lecturas
2Separar operaciones seguras de acciones con efectos
3Definir Content-Type estricto, por ejemplo application/json
4Publicar Accept-Query en los recursos que lo soporten
5Aplicar límites de tamaño y complejidad del body
6Normalizar consultas si se van a cachear
7Configurar CORS, WAF, logs y métricas
8Mantener fallback POST mientras los clientes migran

Un ejemplo de respuesta bien planteada podría incluir cabeceras de caché y descubrimiento:

HTTP/1.1 200 OK
Content-Type: application/json
Accept-Query: application/json
Cache-Control: public, max-age=60
Content-Location: /api/servidores/search-results/8f7a21
Vary: Accept, Content-TypeLenguaje del código: HTTP (http)

La parte delicada será la clave de caché. Si se cachea QUERY en una CDN, la clave debe tener en cuenta el body, el Content-Type y cualquier cabecera que cambie la respuesta. De lo contrario, se corre el riesgo de servir resultados incorrectos. Para búsquedas con permisos por usuario, además, habrá que usar caché privada, variar por identidad o directamente no cachear.

El cambio será lento, pero necesario

QUERY no va a reemplazar a GET ni a POST. Los ordena. GET seguirá siendo perfecto para lecturas simples y URLs compartibles. POST seguirá siendo el método natural para acciones y creación de recursos. QUERY ocupa el espacio que llevaba años vacío: consultas seguras con body.

Su adopción dependerá menos de la RFC y más de la infraestructura. Cuando Cloudflare, AWS, Fastly, Nginx, Envoy, HAProxy, frameworks backend, clientes HTTP y herramientas de OpenAPI empiecen a tratar QUERY como ciudadano de primera, el patrón podrá entrar en arquitecturas reales. Hasta entonces, habrá que convivir con POST para lecturas complejas y diseñar migraciones con calma.

La novedad importa porque HTTP no cambia todos los días. Y cuando cambia para corregir una práctica que millones de APIs habían normalizado, conviene prestar atención.

Durante años, meter filtros complejos en un POST fue una solución práctica. Ahora empieza a ser una deuda semántica con fecha de salida.

Preguntas frecuentes

¿QUERY sustituye a GET?
No. GET sigue siendo la mejor opción para lecturas simples, cacheables y representables en una URL. QUERY está pensado para consultas de lectura que necesitan body.

¿QUERY sustituye a POST?
Tampoco. POST sigue siendo el método adecuado para crear recursos, lanzar acciones o ejecutar operaciones con efectos. QUERY sirve para consultas seguras e idempotentes.

¿Puedo usar QUERY ya en producción?
Depende de tu stack. Antes hay que validar soporte en servidor, proxy, CDN, WAF, clientes HTTP, observabilidad y CORS. Para muchos entornos será mejor empezar con pilotos internos.

¿QUERY es más seguro porque no mete filtros en la URL?
No en sentido de seguridad informática. Reduce exposición accidental en URLs y logs intermedios, pero el body sigue pudiendo registrarse en aplicación o trazas. TLS, control de logs y validación siguen siendo necesarios.

Suscríbete al boletín SysAdmin

Este es tu recurso para las últimas noticias y consejos sobre administración de sistemas, Linux, Windows, cloud computing, seguridad de la nube, etc. Lo enviamos 2 días a la semana.

¡Apúntate a nuestro newsletter!


– patrocinadores –

Noticias destacadas

– patrocinadores –

¡SUSCRÍBETE AL BOLETÍN
DE LOS SYSADMINS!

Scroll al inicio
×