Quelle est la différence entre le JAX-RS @QueryParam
et @MatrixParam
? D'après les documents. Le queryparam et le matrixparam peuvent tous deux localiser une ressource dans un état spécial. Alors, quelle est la différence de cas d'utilisation?
ps:
Queryparam:
url ? key=value;
Matrixparam
url; key=value;
Comme indiqué dans cette documentation Oracle :
Le
@PathParam
et les autres annotations basées sur des paramètres,@MatrixParam
,@HeaderParam
,@CookieParam
,@FormParam
obéissez aux mêmes règles que@QueryParam
.@MatrixParam
extrait les informations des segments de chemin d'URL.@HeaderParam
extrait les informations des en-têtes HTTP.@CookieParam
extrait les informations des cookies déclarés dans les en-têtes HTTP liés aux cookies.
Exemple (tiré de ici ):
@Path("/books")
public class BookService {
@GET
@Path("{year}")
public Response getBooks(@PathParam("year") String year,
@MatrixParam("author") String author,
@MatrixParam("country") String country) {
return Response
.status(200)
.entity("getBooks is called, year : " + year
+ ", author : " + author + ", country : " + country)
.build();
}
}
Voir les modèles d'URI et le résultat suivants:
Modèle d'URI: "/ books/2012 /"
getBooks s'appelle, année: 2012, auteur: null, pays: null
Modèle d'URI: "/ books/2012; author = andih"
getBooks s'appelle, année: 2012, auteur: andih, pays: null
Modèle d'URI: "/ books/2012; author = andih; country = germany"
getBooks s'appelle, année: 2012, auteur: andih, pays: allemagne
Modèle d'URI: "/ books/2012; country = germany; author = andih"
getBooks s'appelle, année: 2012, auteur: andih, pays: allemagne
Pour une explication de la différence, vous pouvez jeter un œil à paramètres de matrice URL vs paramètres de requête
Le
@MatrixParam
l'annotation s'appliquera à une ressource particulière présente dans l'URL et@QueryParam
s'appliquera à l'ensemble de l'URL de demande.
Prenez un exemple de n'importe quel supermarché, si vous voulez que tous les fruits soient satisfaits à plusieurs conditions comme type = fruits et que la fourchette de prix commence à 300 et énumère 10 fruits correspondants, vous pouvez opter pour la conception API ci-dessous,
http://dev.brandstore.com/inventory/grocery;type=fruits/price;range=300/?limit=10
Dans l'exemple ci-dessus, le premier paramètre de matrice type=fruits
s'applique uniquement à épicerie ressource identique range=300
s'applique uniquement à la ressource prix mais au paramètre de requête pour la pagination limit=10
s'applique à l'ensemble de l'URL de demande. Et oui, si seuls des paramètres de requête étaient utilisés, vous vous retrouveriez avec des paramètres tels que "type_épicerie" et "prix_épicerie" et vous perdriez la clarté ajoutée par la localité des paramètres dans la demande.