2010-01-12 5 views
154

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

Примеры

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

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

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

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

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

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

+7

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

+1

@Steve Pomeroy: Это статья, которую вы упомянули: http://www.w3.org/DesignIssues/MatrixURIs.html – Marcel

+3

@Marcel: yup. Для тех, кто думает о матричных URL-адресах, обратите внимание на «Статус: личный вид» в верхней части документа. –

ответ

173

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

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

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

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

+2

unlavant: часть '/?' Представляет ресурс? –

+7

'?' Запускает часть параметра запроса запроса. Параметры запроса являются наиболее распространенным типом параметров URL, в отличие от параметров матрицы. Слэш перед вопросительным знаком гарантирует, что параметр запроса 'page' не запускается в параметре матрицы, который предшествует косой чертой. Я полагаю, что если бы не было параметров матрицы, привязанных к «категориям», параметры запроса могли бы быть присоединены без косой черты: «http: //example.com/res/categories? Page = 1' –

+6

wow супер-интересный, никогда не слышал о параметрах локальности, хотя было 20 лет на веб-разработке! +1 – rupps

9

--Too важно отнести к разделу комментариев.-

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

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

+5

Кто-то расскажет об этом разработчикам Angular 2, которые решили, что они настолько уникальны, что им нужно было это реализовать! –

+0

@MattPileggi Angular2 ребята - причина, по которой я читаю эту тему. Я имею в виду, зачем иметь дело с чем-то, что, вероятно, добавляет немалую ценность уже существующему хорошо известному способу делать вещи! – Willa

+2

@MattPileggi Я также читаю это из-за угла 2. Почти каждый аспект Angular 2 является узкоспециализированным, нетрадиционным и противоречит существующим шаблонам использования. Пока еще не доказано, что это добавляет смягчающую ценность. –

1

В дополнение к Tim Sylvester's asnwer Я хотел бы привести пример того, как параметры матрицы могут быть обработаны с 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; 
    } 
    

    Response

    green 
    

    Но как для документирования состояний

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

    ... что приводит нас к точке 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; 
    } 
    

    Response

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

    Response

    path: categories, matrix parameters [name=foo] 
    path: objects, matrix parameters [name=green] 
    path: attributes, matrix parameters [name=size]