Question

Je me demande si vous souhaitez utiliser des paramètres matrice ou requête dans mes URL. J'ai trouvé une discussion plus à ce sujet non satisfaisant.

Exemples

A première matrice de vue params semblent avoir que des avantages:

  • plus lisible
  • pas d'encodage et le décodage de « et » dans les documents XML est requis
  • URL avec "?" ne sont pas mis en cache dans de nombreux cas; URL avec la matrice params sont mises en cache
  • paramètres de la matrice peuvent apparaître partout dans le chemin et ne sont pas limités à la fin
  • paramètres de la matrice peuvent avoir plus d'une valeur: paramA=val1,val2

Mais il y a aussi des inconvénients:

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

Depuis le développeur du service peut choisir un cadre avec l'appui matrice param, le seul inconvénient reste serait que les navigateurs créent par des paramètres de la requête par défaut.

Y at-il d'autres inconvénients? Que feriez-vous?

Était-ce utile?

La solution

La différence importante est que les paramètres de la matrice sont applicables à un élément de chemin particulier alors que les paramètres de requête sont applicables à la demande dans son ensemble. Cela entre en jeu lors d'une requête complexe de style REST à de multiples niveaux de ressources et de sous-ressources:

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

Il est vraiment à l'espace de nommage. Si seuls les paramètres de la requête ont été utilisés, vous finiriez avec des paramètres tels que « nom_catégorie » et « nom_objet » et vous perdez la clarté ajoutée par la localité des paramètres dans la demande. En outre, lors de l'utilisation d'un framework comme JAX-RS, tous les paramètres de la requête apparaîtraient au sein de chaque gestionnaire de ressources, ce qui conduit à des conflits potentiels et la confusion.

Si votre requête a seulement un « niveau », la différence n'est pas vraiment important et les deux types de paramètres sont effectivement interchangeables, mais les paramètres de la requête sont généralement mieux pris en charge et plus largement reconnus. En général, je recommande de vous en tenir avec des paramètres de requête pour des choses comme des formulaires HTML et simples, des API HTTP à un seul niveau.

Autres conseils

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

Je ne suis pas sûr de ce que le gros problème est avec les URL de la matrice. Selon l'article de conception w3c qui a écrit TBL, il était juste une idée de conception et stipule explicitement que ce n'est pas une caractéristique de la bande. Des choses comme les URL relatives ne sont pas mises en œuvre lors de son utilisation. Si vous voulez l'utiliser, c'est très bien; il n'y a aucun moyen standard pour l'utiliser parce que ce n'est pas une norme. - Steve Pomeroy

réponse courte est, si vous avez besoin RS à des fins d'affaires, vous feriez mieux d'utiliser le paramètre de demande.

En plus de Tim Sylvester réponse Je voudrais donner un exemple de la façon dont les paramètres de la matrice peuvent être manipulés avec 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 @MatrixParam annotation

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

    Réponse

    green
    

    Mais comme les Etats Javadoc

      

    Notez que la valeur d'annotation @MatrixParam fait référence à un nom d'un paramètre de matrice qui se trouve dans le champ dernier identifié le segment de chemin de la structure Java Chemin annotée qui injecte la valeur du paramètre de matrice.

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

  2. Paramètres de la 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 à l'aide n'importe où les variables de chemin et @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]
    

    Etant donné que les paramètres de la matrice sont fournies en tant que MultivaluedMap vous pouvez accéder à chaque par

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

    ou si vous avez besoin le premier

    String name = matrixParameters.getFirst("name");
    
  3. Obtenir tous les paramètres de la matrice comme un paramètre de procédé

    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]
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top