Параметры матрицы URL и параметры запроса - PullRequest
167 голосов
/ 12 января 2010

Мне интересно, использовать ли матрицу или параметры запроса в моих URL. Я нашел более старую дискуссию на эту тему не удовлетворяющей.

Примеры

На первый взгляд, матричные параметры имеют только преимущества:

  • более читабельно
  • не требуется кодирование и декодирование «&» в документах XML
  • URL с "?" не кэшируются во многих случаях; URL-адреса с матричными параметрами кэшируются
  • параметры матрицы могут появляться повсюду в пути и не ограничены его концом
  • матричные параметры могут иметь более одного значения: paramA=val1,val2

Но есть и недостатки:

  • только несколько фреймворков, таких как JAX-RS поддерживают параметры матрицы
  • Когда браузер отправляет форму через GET, параметры становятся параметрами запроса. Таким образом, это заканчивается двумя типами параметров для одной и той же задачи. Чтобы не запутывать пользователей служб REST и ограничивать усилия разработчиков служб, было бы проще всегда использовать параметры запроса - в этой области.

Поскольку разработчик службы может выбрать платформу с поддержкой матричных параметров, единственным оставшимся недостатком будет то, что браузеры по умолчанию создают параметры запроса.

Есть ли другие недостатки? Что бы вы сделали?

Ответы [ 3 ]

199 голосов
/ 09 апреля 2011

Важным отличием является то, что параметры матрицы применяются к конкретному элементу пути, а параметры запроса применяются к запросу в целом.Это вступает в игру при выполнении сложного запроса в стиле REST для нескольких уровней ресурсов и подресурсов:

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

Это действительно сводится к пространству имен.Если бы использовались только параметры запроса, вы бы получили такие параметры, как «имя_категории» и «имя_объекта», и потеряли бы ясность, добавленную локальностью параметров в запросе.Кроме того, при использовании инфраструктуры, такой как JAX-RS, все параметры запроса будут отображаться в каждом обработчике ресурсов, что приведет к потенциальным конфликтам и путанице.

Если ваш запрос имеет только один «уровень», тогда разницана самом деле не важно, и два типа параметров эффективно взаимозаменяемы, однако параметры запроса обычно лучше поддерживаются и более широко распознаются.В целом, я бы порекомендовал вам придерживаться параметров запроса для таких вещей, как формы HTML и простые одноуровневые API-интерфейсы HTTP.

11 голосов
/ 07 сентября 2015

- Слишком важно быть отправленным в раздел комментариев .--

Я не уверен, в чем заключается проблема с матричными URL-адресами.Согласно статье о дизайне w3c, написанной TBL, это была просто идея дизайна, в которой прямо говорится, что она не является особенностью сети.Такие вещи, как относительные URL-адреса, не используются при его использовании.Если вы хотите использовать это, это нормально;просто нет стандартного способа его использовать, потому что это не стандарт.- Steve Pomeroy

Итак, короткий ответ: если вам нужен RS для бизнес-целей, вам лучше использовать параметр запроса.

8 голосов
/ 25 января 2018

В дополнение к ответу Тима Сильвестра я хотел бы привести пример того, как можно обрабатывать параметры матрицы с помощью JAX-RS .

  1. Параметры матрицы в последнем элементе ресурса

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

    Вы можете получить к ним доступ, используя аннотацию @MatrixParam

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

    Ответ

    green
    

    Но, как и в Javadoc,

    Обратите внимание, что значение аннотации @MatrixParam относитсяна имя параметра матрицы, который находится в последнем сопоставленном сегменте пути структуры Java с аннотацией пути, которая вставляет значение параметра матрицы.

    ... чтоприводит нас к точке 2

  2. Параметры матрицы в середине URL

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

    Вы можете получить доступ к параметрам матрицы в любом месте, используя переменные пути и@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;
    }
    

    Ответ

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

    Так как матрица рапараметры предоставляются в виде MultivaluedMap, доступ к каждому из которых можно получить по

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

    или, если вам нужен только первый

    String name = matrixParameters.getFirst("name");
    
  3. Получить все параметры матрицы как один параметр метода

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

    Использовать List<PathSegment>, чтобы получить их все

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

    Ответ

    path: categories, matrix parameters [name=foo]
    path: objects, matrix parameters [name=green]
    path: attributes, matrix parameters [name=size]
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...