Параметры матрицы URL и параметры запроса
Мне интересно, использовать ли параметры matrix или query в моих URL-адресах. Я нашел старшего обсуждение к этой теме не удовлетворяет.
примеры
- URL с параметрами запроса: http://some.где/что?paramA=1 & paramB=6542
- URL с матричными параметрами:http://some.где / вещь; парама=1; парамб = 6542
на первый взгляд матричные параметры, похоже, имеют только преимущества:
- более читабельным
- кодирование и декодирование " & " в XML-документах не требуется
- URLs с "?"не кэшируются во многих случаях; URL-адреса с матричными парами кэшируются
- параметры матрицы могут появляться везде в пути и не ограничиваются его концом
- параметры матрицы могут иметь более одного значения:
paramA=val1,val2
но есть и минусы:
- всего несколько фреймворки, такие как JAX-RS поддержка матрицы параметров
- когда браузер отправляет форму через GET, параметры становятся параметрами запроса. Таким образом, он заканчивается двумя типами параметров для одной и той же задачи. Чтобы не смущать пользователей остальных сервисов и не ограничивать усилия разработчиков сервисов, было бы проще использовать всегда запрос params - в этой области.
так как разработчик сервиса может выбрать фреймворк с поддержкой matrix param, то только оставшимся недостатком будет то, что браузеры создают по умолчанию параметры запроса.
есть ли другие минусы? Что бы ты сделал?
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 .
параметры 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
параметры матрицы в середине URL
http://localhost:8080/res/categories;name=foo/objects;name=green
можно получить доступ к параметрам матрицы в любом месте, используя переменные пути и
@PathParam
PathSegment
.@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");
получить все параметры матрицы в качестве одного параметра метода
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]