Paramètres de masortingce d’URL vs. parameters de requête

Je me demande s’il faut utiliser des parameters de masortingce ou de requête dans mes URL. J’ai trouvé une discussion plus ancienne sur ce sujet non satisfaisante.

Exemples

  • URL avec parameters de requête: http: //some.where/thing? ParamA = 1 & paramB = 6542
  • URL avec parameters de masortingce: http: //some.where/thing; paramA = 1; paramB = 6542

À première vue, les parameters de la masortingce ne semblent avoir que des avantages:

  • plus lisible
  • aucun codage et décodage de “&” dans les documents XML n’est requirejs
  • URL avec “?” ne sont pas mis en cache dans de nombreux cas; Les URL avec des parameters de masortingce sont mises en cache
  • les parameters de la masortingce peuvent apparaître partout dans le chemin et ne sont pas limités à sa fin
  • les parameters de la masortingce peuvent avoir plus d’une valeur: paramA=val1,val2

Mais il y a aussi des inconvénients:

  • seulement quelques frameworks comme les parameters de masortingce de support JAX-RS
  • Lorsqu’un navigateur envoie un formulaire via GET, les parameters deviennent des parameters de requête. Il en résulte deux types de parameters pour la même tâche. Pour ne pas confondre les utilisateurs des services REST et limiter les efforts des développeurs de services, il serait plus facile d’utiliser toujours les parameters de requête – dans ce domaine.

Comme le développeur du service peut choisir une structure avec prise en charge de la masortingce, le seul inconvénient rest que les navigateurs créent des parameters de requête par défaut.

Y a-t-il d’autres inconvénients? Qu’est-ce que tu ferais?

La différence importante est que les parameters de la masortingce s’appliquent à un élément de chemin particulier, tandis que les parameters de requête s’appliquent à la requête dans son ensemble. Cela entre en jeu lorsque vous effectuez une requête complexe de type REST sur plusieurs niveaux de ressources et de sous-ressources:

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

Cela revient vraiment à l’espace de noms. Si seuls les parameters de la requête étaient utilisés, vous obtiendriez des parameters tels que “category_name” et “object_name” et vous perdriez la clarté ajoutée par la localité des parameters dans la requête. De plus, lorsque vous utilisez un framework tel que JAX-RS, tous les parameters de requête apparaissent dans chaque gestionnaire de ressources, ce qui peut entraîner des conflits et de la confusion.

Si votre requête n’a qu’un seul “niveau”, la différence n’est pas vraiment importante et les deux types de parameters sont effectivement interchangeables. Cependant, les parameters de requête sont généralement mieux pris en charge et plus largement reconnus. En général, je vous recommande de respecter les parameters de requête pour des éléments tels que les formulaires HTML et les API HTTP simples à un seul niveau.

–Il est important d’être relégué pour commenter la section .–

Je ne suis pas sûr du problème avec les URL masortingcielles. Selon l’article de conception de w3c écrit par TBL, ce n’était qu’une idée de conception et déclare explicitement que ce n’est pas une caractéristique 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 bien; il n’y a pas de méthode standard pour l’utiliser car ce n’est pas une norme. – Steve Pomeroy

Si la réponse est courte, si vous avez besoin de RS à des fins commerciales, il vaut mieux utiliser le paramètre de requête.

En plus de la réponse de Tim Sylvester, j’aimerais donner un exemple de la façon dont les parameters de la masortingce peuvent être gérés avec JAX-RS .

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

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

    Vous pouvez y accéder à l’aide de l’annotation @MasortingxParam

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

    Réponse

     green 

    Mais comme les états de javadoc

    Notez que la valeur d’annotation @MasortingxParam fait référence à un nom de paramètre de masortingce qui réside dans le dernier segment de chemin d’access correspondant de la structure Java annotée par chemin qui injecte la valeur du paramètre masortingx.

    … ce qui nous amène au point 2

  2. Paramètres de la masortingce au milieu d’une URL

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

    Vous pouvez accéder aux parameters de la masortingce n’importe où en utilisant les variables de chemin et @PathParam PathSegment .

     @GET @Path("{categoryVar:categories}/objects") public Ssortingng objectsByCatecory(@PathParam("categoryVar") PathSegment categorySegment, @MasortingxParam("name") Ssortingng objectName) { MultivaluedMap masortingxParameters = categorySegment.getMasortingxParameters(); Ssortingng categorySegmentPath = categorySegment.getPath(); Ssortingng ssortingng = Ssortingng.format("object %s, path:%s, masortingxParams:%s%n", objectName, categorySegmentPath, masortingxParameters); return ssortingng; } 

    Réponse

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

    Étant donné que les parameters de la masortingce sont fournis sous forme de MultivaluedMap à MultivaluedMap vous pouvez accéder à chacun d’eux par

     List names = masortingxParameters.get("name"); 

    ou si vous avez seulement besoin du premier

     Ssortingng name = masortingxParameters.getFirst("name"); 
  3. Obtenir tous les parameters de la masortingce en tant que paramètre de méthode unique

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

    Utilisez une List pour les obtenir tous

     @GET @Path("all/{var:.+}") public Ssortingng allSegments(@PathParam("var") List pathSegments) { SsortingngBuilder sb = new SsortingngBuilder(); for (PathSegment pathSegment : pathSegments) { sb.append("path: "); sb.append(pathSegment.getPath()); sb.append(", masortingx parameters "); sb.append(pathSegment.getMasortingxParameters()); sb.append("
    "); } return sb.toSsortingng(); }

    Réponse

     path: categories, masortingx parameters [name=foo] path: objects, masortingx parameters [name=green] path: atsortingbutes, masortingx parameters [name=size]