Paramètres de matrice D'URL en fonction des paramètres de requête

je me demande s'il faut utiliser des paramètres de matrice ou de requête dans mes URLs. J'ai trouvé un plus ancien discussion à ce sujet non satisfaisant.

Exemples

à première vue matrix params semblent avoir que des avantages:

  • plus lisible
  • aucun encodage et décodage de " & "dans les documents XML n'est requis
  • Url "?"ne sont pas mis en cache dans de nombreux cas; les URLs avec des params de matrice sont mis en cache
  • les paramètres de matrice peuvent apparaître partout dans le chemin et ne sont pas limités à sa fin
  • Les paramètres de la matrice
  • peuvent avoir plus d'un valeur: paramA=val1,val2

mais il y a aussi des inconvénients:

  • seulement quelques cadres comme JAX-RS paramètres de matrice de soutien
  • Lorsqu'un navigateur soumet un formulaire via GET, les paramètres deviennent des paramètres d'interrogation. Il se termine donc en deux types de paramètres pour la même tâche. Pour ne pas confondre les utilisateurs des services REST et limiter l'effort pour les développeurs des services, il serait plus facile utiliser toujours requête params dans ce domaine.

étant donné que le développeur du service peut choisir un framework avec support matriciel param, 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?

160
demandé sur Community 2010-01-12 13:14:49

3 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. Ceci entre en jeu lors de la réalisation d'une requête de type REST complexe à plusieurs niveaux de ressources et sous-Ressources:

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

Il s'agit vraiment de namespacing. Si seulement les paramètres de requête étaient utilisés, vous finiriez avec des paramètres comme "category_name" et "object_name" et vous perdriez la clarté ajoutée par la localisation des paramètres dans la requête. En outre, lorsque vous utilisez un framework comme JAX-RS, tous les paramètres de requête apparaîtraient dans chaque gestionnaire de ressources, ce qui entraînerait des conflits potentiels et de la confusion.

si votre requête n'a qu'un" 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 supportés et plus largement reconnus. En général, j'aurais recommandez que vous vous en teniez aux paramètres de requête pour des choses comme les formulaires HTML et les API HTTP simples et de niveau unique.

184
répondu Tim Sylvester 2016-07-13 18:12:13

-- trop important pour être relégué à la section des commentaires.--

Je ne suis pas sûr de ce qu'il y a de plus important avec les URL de matrix. Selon l'article sur le design du w3c que TBL a écrit, il s'agissait simplement d'une idée de design et il stipule explicitement que ce n'est pas une caractéristique du web. Des choses comme les URLs relatives ne sont pas implémentées quand on les utilise. Si vous voulez l'utiliser, c'est très bien; il n'y a tout simplement pas de façon standard de l'utiliser parce que ce n'est pas une norme. - Steve Pomeroy

So la réponse courte est, si vous avez besoin de RS à des fins commerciales, vous êtes mieux à l'aide du paramètre request.

10
répondu Ajeet Ganga 2015-09-07 15:39:53

En plus de Tim Sylvester asnwer j'aimerais donner un exemple de matrice de paramètres peuvent être traitées avec des JAX-RS .

  1. Matix paramètres lors de la dernière ressource de l'élément

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

    vous pouvez y accéder en utilisant le @MatrixParam annotation

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

    réponse

    green
    

    mais comme le dit javadoc

    notez que la valeur d'annotation @MatrixParam fait référence à un nom d'un paramètre de matrice qui réside dans le dernier segment de chemin apparié de la structure Java annotée de chemin qui injecte la valeur du paramètre de matrice.

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

  2. Matrice des paramètres au moyen d'une URL

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

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

    @GET
    @Path("{categoryVar:categories}/objects")
    public String objectsByCatecory(@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]
    

    depuis les paramètres de la matrice sont fournis comme un MultivaluedMap vous pouvez accéder à chacun par

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

    ou si vous n'avez besoin que du premier

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

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

    utilisez 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]
    
6
répondu René Link 2018-01-25 09:39:47