|

Método HTTP QUERY: el GET con body que el WAF lee como bot

El Método HTTP QUERY ya es oficial: la RFC 10008 se publicó en junio de 2026 y define un GET que lleva body. Un desarrollador lo probó en producción sobre Vercel, Supabase y FastAPI: las funciones respondieron bien, pero el bot mitigation de Vercel empezó a bloquear el QUERY con un challenge 403 en el request número 4.

O sea: el runtime está listo. El borde que tenés adelante, no tanto. Y ahí está toda la historia.

El Método HTTP QUERY es un verbo de request con semántica de GET (safe, idempotente, cacheable) que transporta su consulta en el cuerpo del mensaje en vez de la URL. Sirve para búsquedas y filtros que no entran en un query string. Lo estandarizó el IETF en la RFC 10008, publicada en junio de 2026, y cierra un hueco viejo del protocolo HTTP.

En 30 segundos

  • Qué es: QUERY es GET con body. Semántica segura e idempotente, pero la consulta viaja en el cuerpo, no en la URL.
  • Cuándo salió: RFC 10008, publicada en junio de 2026 por el IETF.
  • El problema real: los runtimes (Vercel Python y Node, Supabase Edge, FastAPI) manejan QUERY sin drama. El WAF de adelante todavía lo lee como tráfico raro.
  • Caso concreto: 20 GET limpios, 20 POST limpios, y el QUERY disparó el challenge 403 en el request #4. Reproducido desde un segundo cliente.
  • Qué hacer hoy: probalo en staging, revisá tu bot mitigation antes de mandarlo a producción.

Cloudflare es una plataforma de red de entrega de contenidos (CDN) y servicios de seguridad en la nube fundada en 2010, que acelera la distribución de contenido web y protege contra ataques. Ofrece servicios como caché global, protección DDoS y registro de dominios.

¿Qué es HTTP QUERY y por qué resuelve un problema histórico de las APIs?

Ponele que tenés que buscar posts filtrando por 50 tags distintos, con rangos de fecha y un par de condiciones anidadas. ¿Dónde metés todo eso?

Con GET, en la URL. Y ahí empiezan los dolores: los servidores y proxies cortan la URL en algún punto (muchos rondan los 8 KB), tenés que urlencodear todo, y un filtro con JSON adentro queda ilegible. Con POST el problema es otro: POST significa “estoy modificando algo”. Una búsqueda no modifica nada, así que usar POST es mentirle a la semántica del protocolo. Perdés cacheabilidad, perdés idempotencia, y cualquiera que lea tus logs va a pensar que estás escribiendo datos. Tema relacionado: gestión segura de variables en Cloudflare.

Acá entra QUERY. Tenés semántica de GET (la request es segura, idempotente y cacheable) pero podés mandar la consulta en el body sin el límite de la URL. Según la documentación de la RFC 10008, ese era el gap que HTTP arrastraba hace décadas. No es un verbo nuevo por capricho: es el que faltaba para las búsquedas complejas.

Diferencias prácticas entre GET, POST y el Método HTTP QUERY

La tabla resume por qué QUERY no reemplaza a los otros dos, sino que llena un espacio que ninguno cubría bien.

AspectoGETPOSTQUERY
SemánticaSafe, idempotenteNo safe, no idempotenteSafe, idempotente
¿Lleva body?No (en la práctica)
Dónde viaja la consultaURL (query string)BodyBody
CacheableNo por defecto
Uso correctoLecturas simplesCrear o mutar estadoBúsquedas y filtros complejos
Límite prácticoTamaño de URL (~8 KB)Ninguno relevanteNinguno relevante
método http query diagrama explicativo

Fijate el detalle clave de la última fila. Una búsqueda de propiedades con 15 criterios, o un filtro de ecommerce con 20 tags, revienta el query string de GET. En POST entra, pero rompés la semántica. QUERY entra y respeta la semántica. Ese es todo el punto.

¿Por qué Cloudflare y otros WAF detectan QUERY como bot?

Acá viene lo bueno, que es lo que hizo levantar la ceja al autor del experimento.

Armó cuatro endpoints de echo (Vercel con Python, Vercel con Node, Supabase Edge sobre Deno, y FastAPI local sobre uvicorn) y les tiró GET, POST y QUERY con el mismo cliente y el mismo body. Todos los runtimes respondieron perfectamente. Y entonces el bot mitigation por defecto de Vercel empezó a responder con 403, pero solo al tráfico QUERY. Mismo cliente, mismo payload: 20 GET pasaron limpios, 20 POST pasaron limpios, y el QUERY disparó el challenge en el request número 4. Lo reprodujo desde un segundo cliente para descartar que fuera casualidad. Te puede servir nuestra cobertura de almacenar respuestas en R2 sin costos.

¿Es un bug de Vercel? No. El problema es más aburrido y más grande: la capa de seguridad del borde (el WAF, el bot mitigation) todavía no tiene a QUERY en su modelo de “tráfico normal”. Un verbo que casi nadie usa todavía, con un body inusual, encaja justo en el patrón de “esto parece automatizado”. Los sistemas de bot management de Cloudflare y similares se entrenan sobre lo que ven a diario, y QUERY todavía no forma parte de esa dieta.

La conclusión del autor es filosa: las funciones están listas para QUERY, el borde que tienen adelante no. La adopción va a ser gradual, y no por culpa del runtime.

¿Cómo implementar HTTP QUERY en Python y Node.js?

La parte tranquilizadora: implementarlo es casi trivial. El drama está en el borde, no en tu código.

Python con BaseHTTPRequestHandler

En el runtime Python de Vercel, alcanza con definir un método do_QUERY en tu handler. Sí, así de literal: el BaseHTTPRequestHandler de la librería estándar despacha por nombre de método, así que definís do_QUERY(self) y ya lo estás atendiendo. No hace falta parche ni librería extra.

Node.js y Supabase Edge

En Node, el verbo llega como req.method === 'QUERY' y lo ruteás igual que cualquier otro. En Supabase Edge Functions, que corren Deno detrás de un gateway Kong, el método pasa sin tocar nada. El experimento confirmó los tres entornos respondiendo correctamente. Más contexto en automatizar deploys en edge.

Lo importante: si tu API vive en un servidor propio o en un VPS que manejás vos (por ejemplo un stack Node sobre infraestructura de donweb.com), no tenés un bot mitigation agresivo metiéndose en el medio y podés probar QUERY sin que nadie te tire un 403 sorpresa.

Soporte real en Vercel, Supabase y alternativas

Plataforma / entorno¿Maneja QUERY?Detalle
Vercel serverless (Python)Con do_QUERY en el handler
Vercel serverless (Node)Llega como req.method
Vercel bot mitigation (borde)ProblemaChallenge 403 al tráfico QUERY
Supabase Edge (Deno + Kong)Pasa sin configuración extra
FastAPI local (uvicorn)Usado para los tests de parser

El patrón salta a la vista: verde en los runtimes, amarillo en la capa de seguridad. En los frameworks el soporte todavía es disparejo. La tubería está avanzando, pero el eslabón lento son los intermediarios.

Workarounds mientras el edge evoluciona

Si querés usar QUERY hoy sin comerte un challenge, tenés opciones. Ninguna es perfecta, pero zafan.

  • Ajustá el bot mitigation en desarrollo: si es un entorno de dev o staging, bajá o desactivá el challenge para tu ruta de API mientras probás.
  • Usá una ruta sin WAF agresivo: exponé el endpoint QUERY por un camino donde no haya bot management de por medio.
  • Esperá la actualización del proveedor: es cuestión de tiempo que el borde reconozca el verbo como legítimo.
  • POST como parche temporal: funciona, pero rompés la semántica y perdés cacheabilidad. No es recomendable como solución fija.
  • Probá en staging antes de producción: la regla de oro. Verificá el recorrido completo cliente a borde a función antes de confiar.

Casos de uso donde QUERY le gana a GET y POST

¿Dónde brilla de verdad? En todo lo que sea una lectura con parámetros grandes.

  • Ecommerce y paneles admin: filtrar productos por 20 o más tags, rangos de precio y stock, sin reventar la URL.
  • APIs de reportes: queries con muchos parámetros y agrupaciones que en GET quedarían imposibles de leer.
  • Búsquedas con JSON en el body: un objeto de filtros anidado va limpio en el cuerpo, no urlencodeado en la URL.
  • APIs de IA con prompts largos: una consulta semántica extensa que sigue siendo una lectura, no una mutación.

El criterio es simple. ¿Estás leyendo, no escribiendo? ¿El filtro no entra cómodo en la URL? Ese es el terreno de QUERY.

Qué está confirmado y qué no

Confirmado:

  • La RFC 10008 se publicó en junio de 2026 y define QUERY con semántica de GET más body.
  • Vercel (Python y Node), Supabase Edge y FastAPI manejan el verbo sin cambios de fondo.
  • El bot mitigation por defecto de Vercel challengeó tráfico QUERY con 403, reproducido desde dos clientes.

Pendiente o no confirmado:

  • Cuándo cada WAF y proxy corporativo va a reconocer QUERY como tráfico normal.
  • El soporte en navegadores para disparar QUERY desde el cliente (no crítico para APIs server a server).
  • El timeline exacto de adopción. Todo indica que será gradual a lo largo de los próximos 12 a 24 meses.

Errores comunes al adoptar QUERY

  • Culpar al runtime cuando falla: si te llega un 403, mirá primero el borde (WAF, bot mitigation), no tu función. En el experimento, la función siempre respondió bien.
  • Mandarlo directo a producción: probaste en local con FastAPI, anduvo, lo desplegás y el edge te lo bloquea. Siempre validá el recorrido completo en staging.
  • Volver a POST y dejarlo así: usar POST como parche está bien por una tarde, pero si lo dejás fijo perdés cacheabilidad e idempotencia, y ensuciás la semántica de tu API.
  • Meter QUERY en operaciones que mutan datos: QUERY es safe e idempotente. Si tu endpoint escribe o cambia estado, ese es territorio de POST, PUT o PATCH, no de QUERY.

Preguntas Frecuentes

¿Qué es el Método HTTP QUERY y para qué sirve?

QUERY es un método HTTP con semántica de GET (safe, idempotente, cacheable) que transporta la consulta en el body en lugar de la URL. Sirve para búsquedas y filtros complejos que no entran en un query string. Quedó estandarizado en la RFC 10008, publicada en junio de 2026. Sobre eso hablamos en elegir tu herramienta de CI/CD.

¿Por qué Vercel rechaza QUERY con un challenge 403?

No lo rechaza la función, lo rechaza el bot mitigation por defecto de Vercel, que corre en el borde. Ese sistema todavía no tiene a QUERY en su modelo de tráfico normal y lo interpreta como automatizado. En el experimento, el challenge saltó en el request número 4 pese a que GET y POST pasaban limpios.

¿Cómo implemento QUERY en Python?

En el runtime Python de Vercel alcanza con definir el método do_QUERY(self) dentro de tu clase basada en BaseHTTPRequestHandler. El dispatcher rutea por nombre de método, así que no necesitás librerías extra ni parches. La implementación es trivial: el desafío real está en el borde.

¿Qué diferencia hay entre GET, POST y QUERY?

GET es para lecturas simples y lleva los parámetros en la URL. POST es para crear o modificar estado y usa el body. QUERY combina lo mejor de ambos para búsquedas: semántica segura e idempotente como GET, pero con la consulta en el body como POST.

¿Cuándo conviene usar QUERY en lugar de GET o POST?

Cuando hacés una lectura (no modificás datos) y el filtro es demasiado grande o complejo para la URL. Ejemplos: buscar con 20 tags, reportes con muchos parámetros, o filtros con JSON anidado. Si el endpoint escribe datos, usá POST; si el filtro es chico, GET alcanza.

Conclusión

QUERY resuelve un problema real que HTTP arrastraba hace años: cómo hacer una búsqueda pesada sin mentir con POST ni reventar la URL con GET. Con la RFC 10008 publicada en junio de 2026 y los runtimes ya respondiendo, la pelota pasó a la capa de seguridad del borde.

¿Qué hacer hoy? Si mantenés APIs, probá QUERY en staging, revisá cómo reacciona tu WAF o bot mitigation antes de producción, y no lo uses todavía para operaciones críticas de cara al público. El verbo está listo. El borde, todavía aprendiendo a reconocerlo. Tenerlo mapeado te ahorra el 403 sorpresa a las tres de la mañana.

Fuentes

Te puede interesar...