web-dev-qa-db-fra.com

Quelle est la différence entre QueryParam et MatrixParam dans JAX-RS?

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;

25
jiafu

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:

  1. Modèle d'URI: "/ books/2012 /"

    getBooks s'appelle, année: 2012, auteur: null, pays: null

  2. Modèle d'URI: "/ books/2012; author = andih"

    getBooks s'appelle, année: 2012, auteur: andih, pays: null

  3. Modèle d'URI: "/ books/2012; author = andih; country = germany"

    getBooks s'appelle, année: 2012, auteur: andih, pays: allemagne

  4. 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

14
andih

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.

15
Hardik Patel