Чтобы ваша система была RESTful, одно из требований состоит в том, что клиент заранее ничего не знает о том, как структурированы ваши URI. Это означает, что вы не можете писать код, который создает URI определенным образом, как это делают большинство клиентов Twitter. Общепринятое мнение состоит в том, что для того, чтобы ресурс находился, вам нужно обнаружить его URI в другом месте.
Однако бывают случаи, когда вы используете бесчисленное количество ресурсов в системе, и предоставление ссылок на каждый из них просто глупо. Многомерные данные вписываются в эту категорию. В этих случаях вполне допустимо предоставлять клиенту правила для построения URI, если эти правила обнаруживаются во время выполнения.
OpenSearch является абсолютно RESTful-решением этой проблемы, и в этом он дружествен к программисту. Большая часть использования OpenSearch ограничена простыми читаемыми результатами поиска HTML, но в действительности его можно использовать и для чисто машиночитаемых (например, атомных) результатов поиска:
<Url type="application/atom+xml"
template="...search/?q={searchTerms}"/>
Этот шаблон инструктирует клиентов, что если вы хотите представление атома, вы можете перейти сюда. Но как это соответствует многомерным данным? Расширяемость OpenSearch вступает в игру здесь. Расширение времени OpenSearch описывает, как инструктировать клиентов создавать URL-адреса, представляющие запросы, ограниченные определенным временным диапазоном (при условии, что xmlns:time
привязан правильно:
<Url type="application/atom+xml"
template="...search/?after={time:start}&before={time:end}"/>
Если клиент видит этот шаблон, он видит из шаблона, что он допускает только временные ограничения. Давайте расширим это сами.
Чтобы расширить OpenSearch, я должен обозначить пространство имен и некоторые элементы в этом пространстве имен, чтобы обозначить что-то конкретное. Это должно быть где-то опубликовано, чтобы другие могли получить доступ к документации и внедрить свои собственные серверы и клиентов. Допустим, вы хотите найти клиента по фамилии; Фамилия - довольно общий термин, но недостаточно универсальный, чтобы его стандартизировать. Допустим, я определяю пространство имен, связываю его с префиксом name
в моем описании OpenSearch и открываю следующий шаблон:
<Url type="application/atom+xml"
template="...search?lastName={name:last}"/>
Этот шаблон инструктирует любого клиента, который понимает мое пространство имен name
, что он может выполнять поиск по фамилии, заполнив шаблон.
Это все еще не многомерно, но давайте добавим еще одно измерение; географии. К счастью, есть черновое расширение OpenSearch для географии , которое позволяет выполнять поиск в пределах ограничительной рамки или круга:
<Url type="application/atom+xml"
template="...search/?latitude={geo:lat?}&
longitude={geo:lon?}&
metres={geo:radius?}"/>
Я делю шаблон, чтобы сделать его читаемым.
Шаблон по-прежнему не многомерен, поскольку он позволяет выполнять поиск только в одном измерении (геопространственном). Итак, как вы делаете многомерный поиск? Вы предоставляете шаблон, который показывает, как выполнять многомерный поиск, который имеет смысл объединить:
например. Вот шаблон, который позволяет мне найти людей с заданной фамилией в другом регионе (два измерения):
<Url type="application/atom+xml"
template="combo-find?customerLastName={name:last}&
lat={geo:lat?}&
lon={geo:lon?}&
radius={geo:radius?}"/>
Вот шаблон, который позволяет мне ограничивать имена и геопространственные данные, а также временные ограничения (хотя расширение OpenSearch Time ничего не говорит о том, какое время вы ищете):
<Url type="application/atom+xml"
template="...search/?lastName={name:last}&
lat={geo:lat?}&
lon={geo:lon?}&
r={geo:radius?}&
after={time:start}&
before={time:end}"/>
В этих примерах клиент может свободно просматривать шаблон URI, чтобы выяснить, какие параметры шаблона URI необходимо заполнить. Таким образом, клиент будет знать, какие измерения поддерживает каждый шаблон URI, и сможет определить, какой URI подходит лучше всего в любой момент времени.
RESTfulness всего этого потому, что все ограничения REST соблюдаются; он не имеет состояния, гипермедиа - это движок, он многоуровневый и т. д. OpenSearch - это просто еще один гипермедиа формат, очень хороший в этом!