Je me demande s'il faut utiliser des paramètres de matrice ou de requête dans mes URL. J'ai trouvé une discussion plus ancienne sur ce sujet pas satisfaisante.
Exemples
- URL avec les paramètres de requête: http: //some.where/thing? ParamA = 1 & paramB = 6542
- URL avec paramètres de matrice: http: //some.where/thing; paramA = 1; paramB = 6542
À première vue, les paramètres de matrice semblent n'avoir que des avantages:
- plus lisible
- aucun encodage ni décodage de «&» dans les documents XML n'est requis
- URL avec "?" ne sont pas mis en cache dans de nombreux cas; Les URL avec des paramètres de matrice sont mises en cache
- les paramètres de la matrice peuvent apparaître partout dans le chemin et ne sont pas limités à sa fin
- Les paramètres de matrice peuvent avoir plusieurs valeurs:
paramA=val1,val2
Mais il y a aussi des inconvénients:
- seuls quelques frameworks comme JAX-RS prennent en charge les paramètres de matrice
- Lorsqu'un navigateur soumet un formulaire via GET, les paramètres deviennent des paramètres de requête. Cela se termine donc par deux types de paramètres pour la même tâche. Pour ne pas confondre les utilisateurs des services REST et limiter l'effort des développeurs des services, il serait plus facile d'utiliser toujours les paramètres de requête - dans ce domaine.
Étant donné que le développeur du service peut choisir un cadre avec la prise en charge des paramètres de matrice, le seul inconvénient restant serait que les navigateurs créent par défaut des paramètres de requête.
Y a-t-il d'autres inconvénients? Qu'est-ce que tu ferais?
Réponses:
La différence importante est que les paramètres de matrice s'appliquent à un élément de chemin particulier tandis que les paramètres de requête s'appliquent à la requête dans son ensemble. Cela entre en jeu lors de la création d'une requête complexe de style REST vers plusieurs niveaux de ressources et sous-ressources:
Cela se résume vraiment à l'espacement des noms.
Remarque: les `` niveaux '' de ressources ici sont
categories
etobjects
.Si seuls les paramètres de requête étaient utilisés pour une URL à plusieurs niveaux, vous vous retrouveriez avec
De cette façon, vous perdriez également la clarté ajoutée par la localité des paramètres dans la demande. De plus, lors de l'utilisation d'un framework tel que JAX-RS, tous les paramètres de requête apparaissaient dans chaque gestionnaire de ressources, ce qui entraînerait des conflits potentiels et de la confusion.
Si votre requête n'a qu'un seul "niveau", alors la différence n'est pas vraiment importante et les deux types de paramètres sont effectivement interchangeables, cependant, les paramètres de requête sont généralement mieux pris en charge et plus largement reconnus. En général, je vous recommande de vous en tenir aux paramètres de requête pour des éléments tels que les formulaires HTML et les API HTTP simples à un niveau.
la source
/?
partie représente-t-elle une ressource??
démarre la partie paramètre de requête de la demande. Les paramètres de requête sont le type le plus courant de paramètres d'URL, par opposition aux paramètres de matrice. La barre oblique avant le point d'interrogation garantit que le paramètre de requêtepage
ne s'exécute pas dans le paramètre de matrice qui précède la barre oblique. Je suppose que s'il n'y avait pas de paramètres de matrice attachéscategories
, les paramètres de requête pourraient être attachés sans la barre oblique comme ceci:http://example.com/res/categories?page=1
En plus de la réponse de Tim Sylvester, je voudrais donner un exemple de la manière dont les paramètres de matrice peuvent être traités avec JAX-RS .
Paramètres de la matrice au dernier élément de ressource
Vous pouvez y accéder en utilisant l'
@MatrixParam
annotationRéponse
Mais comme les états Javadoc
... ce qui nous amène au point 2
Paramètres de matrice au milieu d'une URL
Vous pouvez accéder aux paramètres de matrice n'importe où à l'aide des variables de chemin et
@PathParam
PathSegment
.Réponse
Étant donné que les paramètres de la matrice sont fournis comme un,
MultivaluedMap
vous pouvez accéder à chacun parou si vous n'avez besoin que du premier
Obtenez tous les paramètres de matrice comme un paramètre de méthode
Utilisez un
List<PathSegment>
pour les obtenir tousRéponse
la source
- Trop important pour être relégué à la section des commentaires.
Je ne sais pas quel est le problème avec les URL matricielles. Selon l'article sur la conception du w3c que TBL a écrit, il ne s'agissait que d'une idée de conception et déclare explicitement que ce n'est pas une fonctionnalité du Web. Des choses comme les URL relatives ne sont pas implémentées lors de son utilisation. Si vous voulez l'utiliser, c'est très bien; il n'y a tout simplement pas de manière standard de l'utiliser car ce n'est pas une norme. - Steve Pomeroy
Donc, la réponse courte est, si vous avez besoin de RS à des fins commerciales, il vaut mieux utiliser le paramètre de demande.
la source