2010-09-06 2 views
11

Je lis que le chemin HTTP pour passer un tableau dans une requête est de définir un paramètre plusieurs fois:JAX-RS/Rest: définir un paramètre plusieurs fois ou utiliser un seul paramètre délimité par des virgules?

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

Cependant, je l'ai vu aussi le paramètre délimité par des virgules (et je pense que c'est « plus propre «):

2) GET /users?orderBy=last_name,first_name 

Je veux mettre en œuvre les utilisateurs multi-tri (commande par last_name, puis en double last_names sont commandés par prenom). Du point de vue du code, c'est facile (les bibliothèques de Google Guava à la rescousse), mais comment dois-je exposer cela? Est-ce que la première façon préserve même l'ordre des champs (tri par nom_de_famille, puis par prénom)?

Spring convertira par magie un paramètre dans un String [] tableau, si elle est définie à plusieurs reprises dans la demande:

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

Cela me conduit à croire que la première voie est considérée comme la meilleure pratique, bien que je comme la deuxième façon ...

+0

Cela dépend de qui vous avez obtenu votre @RequestParam. Il pourrait être spécifié dans la norme JAX-RS, cependant. – bmargulies

Répondre

4

Je pense que c'est une question d'opinion. JAX-RS vous permet d'avoir des paramètres tels que:

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

que je pense ferait la même chose que du printemps en ce qui concerne une partie « convertir par magie ». Je ne pense pas nécessairement que cela indique une «meilleure pratique» ou non. C'est juste que certains paramètres peuvent avoir plusieurs valeurs et les frameworks vous permettent de lire ces valeurs multiples (pensez à certains formulaires HTML).

Personnellement, j'utiliserais une seule valeur délimitée par des virgules. C'est «propre» comme vous l'avez dit et la valeur est plus facile à construire (vous ne comptez pas sur l'ordre des paramètres/valeurs clés qui peuvent causer des problèmes aux développeurs clients).

+2

Cette approche retournera List avec un élément "last_name, first_name". N'est-ce pas? – Normal

+0

@Normal Je voulais dire que l'exemple Liste ligne de code serait proche de ce que Spring fournit. Je ne suis pas sûr si la spécification JAX-RS a été clarifiée pour préserver l'ordre (et je crois que la plupart des implémentations devraient maintenant). La valeur unique délimitée par des virgules était une approche alternative (et si vous combiniez à la fois la liste et la chaîne unique délimitée par des virgules, vous n'obtiendrez qu'un seul élément comme vous l'avez commenté). En rétrospective, l'approche de la liste avec «GET/users? OrderBy = last_name & orderBy = first_name» est également bonne et constitue plutôt une approche standard dans d'autres cadres de langage. –

13

La première méthode est la méthode standard préférée.

Vous pouvez certainement utiliser la seconde méthode, mais vous devrez implémenter votre propre façon de marquer la valeur du paramètre de requête, avec tous les problèmes que cela implique. Par exemple, considérez ce qui se passe si l'une de vos valeurs contient un caractère ','. Parce que le premier est assez standard, il a l'avantage de s'intégrer parfaitement avec les jax-rs, et les cadres de validation; parce que nous validons toujours nos entrées, n'est-ce pas? ;)

+1

La commande est critique pour l'exigence OP, mais je ne pense pas que l'ordre est garanti par spec. Donc, la première méthode n'est pas fiable et ne devrait pas être utilisée. – Dojo

Questions connexes