Как создать список гипермедиа со ссылками на элементы? - PullRequest
1 голос
/ 03 сентября 2010

У меня есть представление, которое содержит список предметов. Это может легко содержать несколько сотен предметов.

<List>
  <ListItem>...</ListItem>
  <ListItem>...</ListItem>
...
  <ListItem>...</ListItem>
  <ListItem>...</ListItem>
</List>

Для каждого элемента я хочу предоставить набор доступных ссылок. Из набора ссылок каждому элементу может быть разрешен только доступ к подмножеству этих ссылок в зависимости от некоторых условий.

Следующий пример демонстрирует грубую силу.

<List>
  <ListItem Id="345">
     <Link rel="foo" href="http://example.org/List/Items/345/foo"/>
     <Link rel="bar" href="http://example.org/List/Items/345/bar"/>
  </ListItem>
  <ListItem Id="346">
     <Link rel="bar" href="http://example.org/List/Items/346/bar"/>
  </ListItem>
  <ListItem Id="347">
     <Link rel="foo" href="http://example.org/List/Items/347/foo"/>
  </ListItem>

 ...
</List>

Вот альтернативный способ

<List>
  <ListItem Id="345" AvailableRels="foo bar"/>
  <ListItem Id="346" AvailableRels="foo"/>
  <ListItem Id="347" AvailableRels="bar"/>
 ...
  <Link rel="foo" href="http://example.org/List/Items/{Id}/foo"/>
  <Link rel="bar" href="http://example.org/List/Items/{Id}/bar"/>
</List>

Второй подход выглядит намного чище, он требует от клиента большего интеллекта для работы с шаблоном URI. Второй, очевидно, намного меньше для передачи по проводам, однако я делаю HTTP-сжатие, так что мне действительно нужно заботиться?

Мысли? Есть ли другие проблемы, которые мне не хватает? Является ли идея AvailableRels слишком нестандартной? Есть ли что-нибудь подобное в других типах носителей?

Ответы [ 4 ]

2 голосов
/ 03 сентября 2010

Оба они в каком-то новом типе носителя, поэтому я предполагаю, что вы можете определить модели обработки для них обоих. Естественный инстинкт состоит в том, чтобы идти с первым, поскольку он не добавляет невидимую связь между атрибутом в одной области XML и шаблоном URI в другом месте.

Предшествующий уровень техники , которым мы могли бы руководствоваться, например, API Atompub или Sun Cloud, обе из которых предоставляют огромное количество ссылок, часто повторяющихся. Я просто хочу отметить, что OpenSearch может быть передан как свидетельство для подхода шаблона URI , поскольку он предоставляет шаблоны URI и специальные элементы <Url> и <Query>, которые имеют имена элементов соответствующие скобки шаблона URI. Я лично считаю шаблоны OpenSearch очень RESTful. Кроме того, простые формы HTML делают то же самое и не могут считаться RESTful в своей базовой форме.

Недостатком предоставления шаблонов URI является то, что вы не можете легко разделить половину ваших элементов, чтобы иметь href, который идет на сервер A, и другой, который идет на сервер B, или что другие половины на самом деле есть разные места. Вы на самом деле что-то сообщаете своим клиентам о базовой структуре данных , и поэтому клиенты становятся зависимыми от всех элементов, имеющих одинаковую (ish) схему URI для доступа к foo или bar, что делает ее менее гибкой ( возможно, в зависимости от того, как вы документируете данный тип носителя).

2 голосов
/ 03 сентября 2010

Если вы просто хотите уменьшить размер, подумайте о включении ссылки «self» на представление в целом (которое должно быть абсолютным) и объявлении, что все относительные ссылки относятся к нему в вашем типе носителя или протоколе. спекуляция (Вот как это делает Сёдзи ) Тогда ваш пример сжимается до:

<Link rel="self" href="http://example.org/List/Items/"/>
<List>
  <ListItem Id="345">
     <Link rel="foo" href="345/foo"/>
     <Link rel="bar" href="345/bar"/>
  </ListItem>
  <ListItem Id="346">
     <Link rel="bar" href="346/bar"/>
  </ListItem>
  <ListItem Id="347">
     <Link rel="foo" href="347/foo"/>
  </ListItem>

 ...
</List>
1 голос
/ 06 сентября 2010

Глядя на ваше представление, я нахожу очень поразительное сходство с форматом синдикации Atom, который делает это с использованием atom: entry и atom: link.Честно говоря, я в восторге от формата синдикации Atom (ASF).

RFC для ASF http://tools.ietf.org/html/rfc4287

Разметка записей в ASF - rfc5005

Если используются RFC, ваш фид будет выглядеть как -

   <?xml version="1.0" encoding="utf-8"?>
   <feed xmlns="http://www.w3.org/2005/Atom">
     <title>Example Feed</title>
     <link href="http://example.org/" rel="self" />
     <link href="http://example.org/before/345" rel="next" type="application/atom+xml" />
     <link href="http://example.org/after/987" rel="previous" type="application/atom+xml"/>
     <updated>2003-12-13T18:30:02Z</updated>
     <author>
       <name>Darrel Miller</name>
     </author>
     <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>

     <entry>
       <title>Item 987</title>
       <link href="http://example.org/List/Items/987/foo" rel="foo" />
       <link href="http://example.org/List/Items/987/bar" rel="bar" />
       <id>987</id>
       <updated>2003-12-13T18:30:02Z</updated>
       <summary>Some text.</summary>
     </entry>
     ...
     <entry>
       <title>Item 345</title>
       <link href="http://example.org/List/Items/345/foo" rel="foo" />
       <id>345</id>
       <updated>2003-12-13T18:30:02Z</updated>
       <summary>Some text.</summary>
     </entry>

   </feed>

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

  • Установите в ответе заголовки, связанные с HTTP-кэшем, чтобы клиенты могли использовать их для кэширования ответов
  • ИспользоватьСервер кэширования (Squid, Varnish) перед сервером приложений для сокращения времени генерации канала.
  • Поддержка сжатия, т. Е. Поддержка простого и сжатого содержимого в зависимости от возможностей клиента.
0 голосов
/ 03 сентября 2010

Как насчет простого введения нумерации страниц, если вас беспокоит размер необработанных ресурсов?

<List>
  <Previous href="http://example.org/List/before/345"/>
  <Next href="http://example.org/List/after/987"/>
  <ListItem Id="345">
     <Link rel="foo" href="http://example.org/List/Items/345/foo"/>
     <Link rel="bar" href="http://example.org/List/Items/345/bar"/>
  </ListItem>
  ...
  <ListItem Id="987"> ... </ListItem>
<List>
...