Siguiendo los principios REST, me gustaría crear un método GET para mi API que realice una búsqueda utilizando algunos criterios y devuelva los resultados al cliente. El problema es que los criterios pueden tener hasta 14 parámetros, uno de ellos es una lista de objetos complejos, así que ...
Ni siquiera sé si es posible codificar / decodificar estos objetos complejos a / desde parámetros de URL.
No calculé cuánto tiempo podría tardar la url, pero estoy seguro de que será lo suficientemente grande y tal vez alcance el límite de longitud de la url.
Además, la búsqueda debe mostrar los resultados en "tiempo real", es decir, cada vez que el usuario cambia algo del formulario de búsqueda, debería poder ver los nuevos resultados sin presionar ningún botón de "búsqueda".
¿Podría aclararme estos puntos y cuál sería su consejo para crear un método de búsqueda tranquilo con muchos parámetros?
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.Respuestas:
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 conGET
. 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:
/search?q=SGVsbG8gV29ybGQh....
).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.
fuente
Si todo lo que tienes es un martillo, todo parece un clavo. Parece que el problema aquí es que está tratando de convertir una página de búsqueda en RESTful, y esto difícilmente parece ser un patrón común para el diseño RESTful para resolver.
Simplemente vaya con una solicitud POST con los parámetros proporcionados por el usuario para obtener la información que necesita del backend. Supongo que no necesita hacer nada más que realizar una búsqueda, por lo que no hay posibilidad de que tenga que insertar a través de esta página. Simplemente agregue una / búsqueda al final de su URL para no correr el riesgo de tener conflictos con su página / usuarios que sería RESTful.
fuente
Depende completamente de cuál sea su modelo de API: como ninguno o como verbo.
Si la API no es válida, entonces puede obtener una lista de objetos de la siguiente manera:
En este caso, debe enviar datos como parámetros de solicitud. Por lo tanto, debe describir sus parámetros como una lista plana de valores-clave:
Algunas plataformas admiten resolución de parámetros personalizados (por ejemplo, Spring MVC), y puede convertir parámetros en un objeto.
fuente