Antes de leer mi respuesta, me gustaría decir que estuve de acuerdo con @Neil. Tenemos que elegir nuestras batallas. Por lo general, queremos hacerlo lo mejor posible, pero a veces hay muy poco espacio para la discusión y tenemos que tomar decisiones en contra de nuestra voluntad.
De todos modos, en la respuesta de Neil, extraño una cosa más. Documentación . Solo para garantizar que los desarrolladores sepan que las solicitudes POST /search
son seguras.
Eso dicho
1. Dale la oportunidad de OBTENER
Considere la GET
opción primero. Echa un vistazo a la longitud máxima de la URL de esta pregunta . Evalúe si su cadena de consulta más larga tiene más de 2000 caracteres. Si no es así, y no esperas que sea así, ve con GET
. Puede parecer feo, pero al menos puede marcar la URL y, por supuesto, tiene todas las ventajas derivadas de la semántica del método (idempotencia, seguridad y almacenamiento en caché)
1.1 Intente codificar la cadena de consulta
Por ejemplo, en base 64. Incluso JavaScript admite codificaciones de base 64 .
Así es como funciona:
- Construya el JSON con todos los filtros y normalícelo.
- Analizarlo en cadena
- Codificarlo
- Envíe el JSON codificado como request param (
/search?q=SGVsbG8gV29ybGQh....
).
- En el lado del servidor, decodifique el parámetro q .
- Deserializar la cadena JSON
Anteriormente, haga la cadena JSON más larga posible, codifíquela y tome la longitud. Evaluar si la cadena codificada encaja en la URL. He implementado el siguiente fragmento en Fiddle.js para que lo pruebes . (Espero que todavía funcione) 1
Las codificaciones de base 64 son deterministas y reversibles, por lo que no hay posibilidad de colisiones.
Con consultas codificadas, también podríamos guardar búsquedas en la base de datos, marcar la URL, compartir enlaces, etc. Y, por supuesto, no tenemos que escapar / escapar de la cadena.
1.2 Probar con alias
Al leer este blog sobre cómo diseñar API REST, recordé una alternativa más. Alias para consultas comunes .
Me parecen interesantes por las siguientes razones.
Acorte la longitud de la cadena de consulta. Hace que la API sea más limpia y fácil de usar
GET / tickets /? Status = cerrado y cerrado At = xxx vs
GET / tickets / recientemente cerrado /
Combinable con más alias o más parámetros de solicitud.
GET / tickets /? Status = cerrado y cerradoAt = xxx & dentro = 30min vs
GET / tickets / recientemente cerrado /? Dentro = 30min
Podemos combinar alias con cadenas de consulta codificadas
GET / tickets /? Status = cerrado y cerradoAt = xxx & dentro = 30min vs
GET / tickets / recientemente cerrado /? Q = SGVsbG8g ...
1: He usado JSON, pero podríamos usar otros formatos tan pronto como podamos deserializarlo en el lado del servidor.
search?q=t
,search?q=te
,search?q=test
, y así sucesivamente. Considere limitar la frecuencia con la que se envía la consulta para evitar dañar su servidor. Alternativamente, también puede devolver una gran cantidad de información y del lado del cliente hacer el filtrado. Eso funciona bien si el usuario ingresa en categorías amplias que pueden reducir mucho las cosas.