¿Te ha pasado que, tras lanzar una API, el último parche te deja más dudas que respuestas? Pues prepárate, que el protocolo HTTP ha decidido darle una vuelta de tuerca y ha sacado el método QUERY. Sí, justo cuando ya tenías la lista de “cosas que no van a pasar en producción”.

Según el RFC 10008, QUERY es un método seguro, idempotente y, sobre todo, “casi nunca lo viste venir”. En esta pieza vamos a desmenuzar qué demonios hace, por qué su caché es una pesadilla y, de paso, nos echaremos un código de ejemplo que hasta tu abuelo entendería (si el abuelo fuera dev).

¿Qué es el método QUERY?

¿Por qué es tan difícil cachearlo?: El nuevo método HTTP QUERY (RFC 10008): ¿Por qué es tan difícil cachearlo? software  - imagen ilustrativa
Foto por Kevin Martin Jose en Unsplash

En pocas palabras, QUERY es la versión “GET con sombrero”. Sirve para solicitar datos sin intención de modificarlos, pero a diferencia de GET, permite que el mensaje incluya un cuerpo. Sí, lo leíste bien: cuerpo en una petición segura. Esto abre la puerta a consultas más complejas sin romper la regla de idempotencia.

Seguridad e idempotencia (o la ilusión de tranquilidad)

Seguridad e idempotencia (o la ilusión de tranquilidad) nuevo todo HTTP - imagen ilustrativa
Foto por Mayumi Maciel en Unsplash

El RFC lo describe como “seguro y sin efectos secundarios”. En la práctica, eso significa que puedes enviar la misma petición mil veces y el estado del servidor no cambiará. Ideal para lecturas intensivas, pero cuidado con los “cuerpos” gigantes: si el payload supera los límites de tu reverse proxy, el servidor tirará la conexión como si fuera una cadena de memes sin gracia.

Caching: la pesadilla del dev

Caching: la pesadilla del dev nuevo todo HTTP - imagen ilustrativa
Foto por Bertrand Colombo en Unsplash

Si creías que cachear GET era complicado, espera a ver QUERY. Los caches tradicionales (Varnish, Cloudflare) se basan en la URL y los encabezados Accept, User-Agent, etc. El cuerpo, sin embargo, queda fuera del hash por defecto, lo que lleva a que dos peticiones distintas con el mismo URL y diferente payload terminen compartiendo la misma respuesta.

La solución oficial es que las implementaciones respeten el encabezado Cache-Control: payload-hash, pero la mayoría todavía lo ignora. En otras palabras, tu API puede devolver datos obsoletos y tú seguirás pensando que todo está bajo control, como cuando tu colega dice “funciona en su máquina”.

Implementación práctica en Node/Express

Vamos a ver cómo exponer un endpoint QUERY con Express 5.x. La magia está en registrar el método con app.all y validar que req.method sea 'QUERY'. Aquí tienes el snippet listo para copiar‑pegar (y arriesgarte a que tu IDE se ría):

const express = require('express');
const app = express();

// Necesitamos parsear JSON en el cuerpo, aunque sea una "QUERY"
app.use(express.json());

app.all('/api/search', (req, res) => {
  if (req.method !== 'QUERY') {
    return res.status(405).send({ error: 'Método no permitido' });
  }

  const { term, filters } = req.body;
  // Simulación de búsqueda lenta
  const results = fakeDatabase.search(term, filters);
  res.set('Cache-Control', 'max-age=60, payload-hash');
  res.json({ term, results });
});

app.listen(3000, () => console.log('Servidor escuchando en puerto 3000'));

Observa cómo colocamos Cache-Control con el flag payload-hash. Si tu CDN soporta esa extensión, ya tendrás una cache más inteligente. Si no, siempre puedes caer en la vieja táctica de “añadir un hash a la URL”.

Conclusión

El método QUERY llega como una bofetada fresca a la monotonía de GET. Ofrece mayor expresividad, pero también nos obliga a replantear cómo cacheamos peticiones con cuerpo. Si tu stack no soporta payload-hash, prepárate para escribir más tests que líneas de código.

En cualquier caso, la recomendación de un senior (y de tu taza de café) es: no subestimes la complejidad del caché y siempre monitorea los encabezados de respuesta. Así evitarás que tu API se convierta en el próximo meme viral por el motivo equivocado.

Referencias