Параметры матрицы URL и параметры запроса


Мне интересно, использовать ли параметры matrix или query в моих URL-адресах. Я нашел старшего обсуждение к этой теме не удовлетворяет.

примеры

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

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

но есть и минусы:

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

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

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

3 160

3 ответа:

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

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

это действительно сводится к пространству имен. Если бы использовались только параметры запроса, вы бы получили такие параметры, как "category_name "и" object_name", и вы потеряли бы ясность, добавленную локальностью параметры внутри запроса. Кроме того, при использовании такой платформы, как JAX-RS, все параметры запроса будут отображаться в каждом обработчике ресурсов, что приведет к потенциальным конфликтам и путанице.

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

--слишком важно, чтобы быть отнесены к разделу комментариев.--

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

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

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

  1. параметры Matix на последнем элементе ресурса

    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, которая вводит значение параметра matrix.

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

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

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

    можно получить доступ к параметрам матрицы в любом месте, используя переменные пути и @PathParamPathSegment.

    @GET
    @Path("{categoryVar:categories}/objects")
    public String objectsByCatecory(@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]