Подтвердить что ты не робот

Какая разница между QueryParam и MatrixParam в JAX-RS?

Какая разница между JAX-RS @QueryParam и @MatrixParam? Из документов. Параметр queryparam и matrixparam могут размещать один ресурс в специальном состоянии. Итак, какая разница в использовании?

ps:

Queryparam:

url ? key=value;

Matrixparam

url; key=value;

4b9b3361

Ответ 1

Как указано в этой документации Oracle:

@PathParam и другие аннотации на основе параметров, @MatrixParam, @HeaderParam, @CookieParam, @FormParam подчиняются те же правила, что и @QueryParam. @MatrixParam извлекает информацию из URL-адреса. @HeaderParam извлекает информацию из HTTP заголовки. @CookieParam извлекает информацию из объявленных файлов cookie в HTTP-заголовках, связанных с cookie.

Пример (из здесь):

@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();

    }

}

См. следующие шаблоны URI и результат:

  • URI Pattern: "/books/2012/"

    getBooks называется, год: 2012, автор: null, страна: null

  • URI Pattern: "/books/2012; author = andih"

    getBooks называется, год: 2012, автор: andih, страна: null

  • URI Pattern: "/books/2012; author = andih; country = germany"

    getBooks называется, год: 2012, автор: andih, страна: Германия

  • URI Pattern: "/books/2012; country = germany; author = andih"

    getBooks называется, год: 2012, автор: andih, страна: Германия

Для объяснения разницы вы можете взглянуть на Параметры матрицы URL и параметры запроса

Ответ 2

Аннотация @MatrixParam будет применяться к определенному Ресурсу, присутствующему в URL-адресе и @QueryParam будет применяться ко всему URL-адресу запроса.

Возьмем пример любого супермаркета. Если вы хотите, чтобы все фрукты были удовлетворены несколькими условиями, такими как type = fruit и ценовой диапазон, начиная с 300 и перечисляя соответствующие 10 фруктов, вы можете пойти ниже API Design,

http://dev.brandstore.com/inventory/grocery;type=fruits/price;range=300/?limit=10

В приведенном выше примере первая матрица Param type=fruits применяется только к ресурсу бакалеи, то же самое range=300 применяется только к ресурсу цена, но Query Param для разбивки на страницы limit=10 применяется ко всему URL-адресу запроса. И да, если бы использовались только параметры запроса, у вас были бы такие параметры, как "grocery_type" и "grocery_price", и вы потеряли бы ясность, добавленную местностью параметров в запросе.