2010-09-06 17 views
11

leí que el camino HTTP para pasar una matriz en una solicitud es para establecer un parámetro varias veces:JAX-RS/Rest: ¿establece un parámetro varias veces o usa un único parámetro delimitado por comas?

1) GET /users?orderBy=last_name&orderBy=first_name 

Sin embargo, también he visto el parámetro delimitado por comas (y siento que este es "más limpio "):

2) GET /users?orderBy=last_name,first_name 

Quiero poner en práctica múltiples clasificar (ordenar los usuarios por apellidos y, a continuación, duplicar last_names están clasificadas por nombre apellido). En lo que respecta al código, es fácil (las bibliotecas de Guava de Google al rescate), pero ¿cómo debo exponer esto? ¿La primera manera incluso preserva el orden de los campos (ordena por apellido, luego por primer nombre)?

primavera convertirá mágicamente un parámetro en una matriz String [], si está puesto varias veces en la solicitud:

... @RequestParam("orderBy") String[] orderBy ... becomes ["last_name","first_name"] 

Esto me lleva a creer que la primera manera se considera la mejor práctica, aunque como la segunda manera ...

+0

Esto depende de a quién le hayas sacado tu @RequestParam. Sin embargo, podría estar especificado en el estándar JAX-RS. – bmargulies

Respuesta

4

Creo que es una cuestión de opinión. JAX-RS le permite tener parámetros como:

@QueryParam("orderBy") List<String> orderBy 

que creo que haría lo mismo que la primavera con respecto a "mágicamente convertir" a parte. No necesariamente creo que esto sea indicativo de una "mejor práctica" o no. Es solo que algunos parámetros pueden tener múltiples valores y los marcos le permiten leer esos valores múltiples (piense en ciertos formularios HTML).

Personalmente, utilizaría un valor único que está delimitado por comas. Es "más limpio" como dijiste y el valor es más fácil de compilar (no dependes del orden de las claves/valores de los parámetros, lo que puede generar problemas para los desarrolladores de los clientes).

+2

Este enfoque devolverá List con un elemento "last_name, first_name" en él. ¿No es así? – Normal

+0

@Normal Quise decir que la línea de código de la lista de ejemplo estaría cerca de lo que ofrece Spring. No estoy seguro de si la especificación JAX-RS fue aclarada para preservar el orden (y creo que la mayoría de las implementaciones deberían hacerlo ahora). El valor único delimitado por comas era un enfoque alternativo (y si combinaba tanto la lista como la cadena única delimitada por comas, obtendrá solo un elemento como comentó). En retrospectiva, el enfoque de List con "GET/users? OrderBy = last_name & orderBy = first_name" también es bueno y es más un enfoque estándar en otros marcos de lenguaje. –

13

El primer método es la forma preferida y estándar.

Sin duda puede usar la segunda forma, pero tendrá que implementar su propia forma de tokenizar el valor del parámetro de solicitud, con todos los problemas que esto conlleva. Por ejemplo, considere qué pasa si uno de sus valores contiene un carácter ','.

Como la primera es bastante estándar, tiene la ventaja de encajar perfectamente con jax-rs y marcos de validación; porque siempre validamos nuestras entradas, ¿verdad? ;)

+1

La orden es crítica para el requisito de OP pero no creo que el orden esté garantizado por la especificación. Por lo tanto, el primer método no es confiable y no debe utilizarse. – Dojo

Cuestiones relacionadas