202 votes

Paramètres de la matrice de l'URL et paramètres de la requête

Je me demande si je dois utiliser des matrices ou des paramètres de requête dans mes URL. J'ai trouvé un ancien discussion à ce sujet n'est pas satisfaisante.

Exemples

À première vue, les paramètres de la matrice semblent n'avoir que des avantages :

  • plus lisible
  • aucun encodage ni décodage de "&" dans les documents XML n'est nécessaire
  • Les URL avec " ?" ne sont pas mis en cache dans de nombreux cas ; les URL avec des paramètres de matrice sont mis en cache.
  • les paramètres de la matrice peuvent apparaître partout dans le chemin et ne sont pas limités à son extrémité
  • les paramètres de la matrice peuvent avoir plus d'une valeur : paramA=val1,val2

Mais il y a aussi des inconvénients :

  • seuls quelques cadres comme JAX-RS paramètres de la matrice de soutien
  • Lorsqu'un navigateur soumet un formulaire via GET, les paramètres deviennent des paramètres de requête. Il s'agit donc de deux types de paramètres pour la même tâche. Pour ne pas dérouter les utilisateurs des services REST et limiter les efforts des développeurs de ces services, il serait plus simple d'utiliser toujours des paramètres de requête - dans ce domaine.

Étant donné que le développeur du service peut choisir un cadre de travail prenant en charge les 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 ? Que feriez-vous ?

12 votes

Je ne vois pas très bien où est le problème avec les URL matricielles. Selon l'article du w3c sur la conception que TBL a écrit, il s'agissait simplement d'une idée de conception et il est explicitement indiqué qu'il s'agit de no une caractéristique du web. Des choses comme les URL relatives ne sont pas mises en œuvre lorsqu'on l'utilise. Si vous voulez l'utiliser, c'est très bien ; il n'y a simplement pas de méthode standard pour l'utiliser parce que ce n'est pas une norme.

3 votes

@Steve Pomeroy : Est-ce que c'est l'article que vous mentionnez : w3.org/DesignIssues/MatrixURIs.html

4 votes

@Marcel : oui. Pour ceux qui pensent à des URLs matricielles, notez le "Statut : vue personnelle" en haut du document.

237voto

Tim Sylvester Points 14047

La différence importante est que les paramètres de matrice s'appliquent à un élément de chemin particulier alors que les paramètres de requête s'appliquent à la requête dans son ensemble. Cela entre en jeu lorsqu'il s'agit de faire une requête complexe de type REST à plusieurs niveaux de ressources et de sous-ressources :

http://example.com/res/categories;name=foo/objects;name=green/?page=1

Il s'agit en fait d'une question d'espacement des noms.

Note : Les "niveaux" de ressources sont les suivants categories y objects .

Si seuls les paramètres de requête étaient utilisés pour une URL à plusieurs niveaux, on obtiendrait

http://example.com/res?categories_name=foo&objects_name=green&page=1

De cette manière, vous perdriez également la clarté apportée par la localité des paramètres dans la requête. En outre, si l'on utilise un cadre comme JAX-RS, tous les paramètres de la requête apparaîtront dans chaque gestionnaire de ressources, ce qui entraînera des conflits potentiels et de la confusion.

Si votre requête ne comporte qu'un seul "niveau", la différence n'est pas vraiment importante et les deux types de paramètres sont effectivement interchangeables. En général, je vous recommande de vous en tenir aux paramètres de requête pour des choses telles que les formulaires HTML et les API HTTP simples à un seul niveau.

2 votes

Irrelavant : est-ce que /? partie représentant une ressource ?

8 votes

T ? démarre la partie "paramètres de la 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 qui précède le point d'interrogation permet de s'assurer que le paramètre de requête page ne se heurte pas au paramètre de la matrice qui précède la barre oblique. Je suppose que s'il n'y avait pas de paramètres matriciels attachés à categories les paramètres de la requête pourraient être attachés sans le slash comme ceci : http://example.com/res/categories?page=1

9 votes

S'il est vrai que les paramètres de la matrice peuvent être spécifiés dans n'importe quel segment de chemin, JAX-RS, par exemple, ne les associe pas au segment de chemin auquel ils ont été ajoutés lors de l'injection avec @MatrixParam. Selon "Restful Java with JAX-RS 2.0", une requête comme "GET /mercedes/e55;color=black/2006/interior;color=tan" aurait une définition ambiguë du paramètre de matrice de couleur. Cependant, il semble que si vous traitez chaque PathSegment individuellement, vous pouvez trouver la solution... C'est donc utile, mais cela demande plus de travail que si vous aviez spécifié categoryName=foo;objectName=green.

24voto

René Link Points 9136

En plus de Tim Sylvester's Je voudrais donner un exemple de la façon dont les paramètres de la matrice peuvent être gérés avec la fonction JAX-RS .

  1. Paramètres de la matrice au dernier élément de ressource

    http://localhost:8080/res/categories/objects;name=green

    Vous pouvez y accéder en utilisant la fonction @MatrixParam annotation

    @GET
    @Path("categories/objects")
    public String objects(@MatrixParam("name") String objectName) {
      return objectName;
    }

    Réponse

    green

    Mais comme l'indique le Javadoc

    Il convient de noter que le @MatrixParam fait référence au nom d'un paramètre de la matrice qui se trouve dans l'annotation dernier segment de chemin correspondant de la structure Java annotée Path qui injecte la valeur du paramètre de la matrice.

    ... ce qui nous amène au point 2

  2. Paramètres de matrice au milieu d'une URL

    http://localhost:8080/res/categories;name=foo/objects;name=green

    Vous pouvez accéder aux paramètres de la matrice n'importe où en utilisant des variables de chemin et des @PathParam PathSegment .

    @GET
    @Path("{categoryVar:categories}/objects")
    public String objectsByCategory(@PathParam("categoryVar") PathSegment categorySegment, 
                                    @MatrixParam("name") String objectName) {
      MultivaluedMap<String, String> matrixParameters = categorySegment.getMatrixParameters();
      String categorySegmentPath = categorySegment.getPath();
      String string = String.format("object %s, path:%s, matrixParams:%s%n", objectName,
              categorySegmentPath, matrixParameters);
      return string;
    }

    Réponse

    object green, path:categories, matrixParams:[name=foo]

    Étant donné que les paramètres de la matrice sont fournis sous la forme d'un MultivaluedMap vous pouvez accéder à chacun d'entre eux en

    List<String> names = matrixParameters.get("name");

    ou si vous n'avez besoin que du premier

    String name = matrixParameters.getFirst("name");
  3. Obtenir tous les paramètres de la matrice en un seul paramètre de méthode

    http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size

    Utiliser un List<PathSegment> pour les obtenir tous

    @GET
    @Path("all/{var:.+}")
    public String allSegments(@PathParam("var") List<PathSegment> pathSegments) {
      StringBuilder sb =  new StringBuilder();
    
      for (PathSegment pathSegment : pathSegments) {
        sb.append("path: ");
        sb.append(pathSegment.getPath());
        sb.append(", matrix parameters ");
        sb.append(pathSegment.getMatrixParameters());
        sb.append("<br/>");
      }
    
      return sb.toString();
    }

    Réponse

    path: categories, matrix parameters [name=foo]
    path: objects, matrix parameters [name=green]
    path: attributes, matrix parameters [name=size]

11voto

Ajeet Points 1642

--Trop important pour être relégué dans la section des commentaires

Je ne vois pas très bien où est le problème avec les URL matricielles. D'après l'article sur la conception du w3c écrit par TBL, il s'agissait simplement d'une idée de conception et il est explicitement indiqué qu'il ne s'agit pas d'une caractéristique du web. Des choses comme les URL relatives ne sont pas implémentées lorsqu'elles sont utilisées. Si vous voulez l'utiliser, c'est très bien ; il n'y a simplement pas de façon standard de l'utiliser parce que ce n'est pas une norme.

- Steve Pomeroy .

En résumé, si vous avez besoin de RS à des fins professionnelles, il est préférable d'utiliser le paramètre de requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X