Другая проблема заключается в том, что мы не можем использовать описательные URL-адреса, такие как /resources/../customer/Madonna/phonenumber.
Я думаю, вы неправильно поняли суть непрозрачных URI. Понятие непрозрачных URI относится к клиентам: Клиент не должен расшифровывать URI , чтобы угадать что-либо из семантического значения из него. Так что сервис может иметь такие URI, как /resources/.../customer/Madonna/phonenumber
, и это неплохая идея. URI должны считаться непрозрачными клиентами: не следует из URI выводить, что он представляет номер телефона Мадонны и что Мадонна является клиентом какого-то рода. Это знание можно получить, только заглянув внутрь самого URI или, возможно, вспомнив, где был обнаружен URI.
Edit:
Следствием этого является то, что навигация должна осуществляться по ссылкам, а не путем деконструкции URI. Поэтому, если вы видите /resouces/customer/Madonna/phonenumber
(и на самом деле это номер телефона Заказчика Мадонны), у вас должны быть ссылки на этот ресурс, чтобы указывать на ресурс Мадонны: например,
{
"phone_number" : "01-234-56",
"customer_URI": "/resources/customer/Madonna"
}
Это единственный способ перейти от ресурса номера телефона к ресурсу клиента. Важным аспектом является то, что реализация сервера может содержать или не содержать информацию, относящуюся к домену, в URI. Запись Мадонны с таким же успехом может существовать где-то еще: /resources/customers/byid/81496237
. Вот почему клиенты должны рассматривать URI как непрозрачные.
Редактировать 2:
Другой вопрос, который у вас есть (в комментариях), заключается в том, как клиент с необходимыми знаниями о URI сервера не может найти что-либо. Клиенты имеют следующие возможности поиска ресурсов:
Предоставить интерфейс поиска . Это может быть сделано путем предоставления документа описания OpenSearch, в котором говорится, как искать элементы. Шаблон OpenSearch может включать несколько переменных и несколько конечных точек, в зависимости от того, что вы ищете. Поэтому, если у вас есть уникальный идентификатор клиента, вы можете использовать следующий шаблон: /customers/byid/{proprietary:customerid}"
, элемент customerid
должен быть где-то задокументирован, внутри пространства имен proprietary
. Затем клиент может знать, как использовать такой шаблон.
Предоставьте пользовательскую форму . Это подразумевает создание пользовательского типа мультимедиа, в котором вы явно определяете, как (на основе экземпляра документа) можно подделать URI для клиента. <customers template="/customers/byid/{id}"/>
. В документации (для типа носителя) должно быть указано, что атрибут шаблона должен интерпретироваться как относительный URI после замены строки "{id}
" на фактический идентификатор клиента.
Предоставить ссылки на все ресурсы . Некоторые ресурсы не являются бесчисленными, поэтому вы можете просто сделать ссылку на каждый из них, опционально включая идентификационную информацию вместе со ссылками. Это также может быть сделано в пользовательском типе носителя: <customer id="12345" href="/customer/byid/12345"/>
.
Следует отметить, что # 1 и # 2 - это два способа сказать одно и то же: клиентам разрешено создавать URI, если они
- априори не имеет структуры URI
- существует тип носителя, для которого в документации указано, что должны быть созданы URI
Это почти так же, как веб-браузер не имеет представления о какой-либо структуре URI в Интернете, за исключением правил, изложенных в определении форм HTML, для добавления ?
, а затем всех параметров запроса, разделенных &
.
Теоретически, если у вас есть клиент с идентификатором 12345, тогда вы можете обойтись без href, поскольку вы можете подключить идентификатор клиента 12345 к # 1 или # 2. Чаще встречается предоставление реальных связей между ресурсами, а не использование методов поиска или поиска.