У меня есть довольно простой вопрос о внедрении клиента доступа к данным, который строго придерживается архитектурных принципов REST. Для начала предположим, что у меня есть хороший REST API, который я хочу использовать с помощью приложения Django. Начну, обнаруживая, что услуги предоставляются (отредактированный для наблюдения):Взаимодействие с клиентами RESTful
GET example.com/services/ HTTP/1.1
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<services>
<service>
<name>Widgets</name>
<link>http://example.com/services/widgets/</link>
<item_link>http://example.com/services/widgets/{widget_id}/</item_link>
</service>
<service>
<name>Factories</name>
<link>http://example.com/services/factories/</link>
<item_link>http://example.com/services/factories/{factory_id}/</item_link>
</service>
...
</services>
Теперь, так как я создаю приложение Django на основе вокруг употребления этого API, как бы я по-прежнему продолжайте исследовать эти услуги RESTfully? Чтобы придерживаться принципов REST, мое приложение должно управляться полученной гипермедиа. Я полагаю, что первый шаг достаточно прост - взаимодействие с услугой по названию. Я создал представление Django следующим образом:
def get_service(request, service_name):
doc = etree.parse(urllib.urlopen('http://example.com/services/'))
uri = doc.xpath("service/name[.='%s']/following-sibling::*" % service_name)[0].text
...
От которого я выполнить другой запрос (отредактированный для наблюдения):
GET example.com/services/widgets/ HTTP/1.1
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<widgets>
<item_link>http://example.com/services/widgets/{widget_id}/</item_link>
<widget>
<id>1</id>
<name>Whizbang Foobar</name>
<link>http://example.com/services/widgets/1</link>
</widget>
...
</widgets>
Теперь я отобразить простой список виджетов в обработанном шаблоне Django. Отсюда, как, как я продолжаю взаимодействовать с этим сервисом RESTfully? Возможно, я запутался в замешательстве, но единственное, что я могу придумать, - это реализовать множество представлений приложений или тонкую модель данных Django, чтобы сохранить URI службы.
Мое главное беспокойство сводится к тому, что это абсолютно не нужно, строго придерживаясь архитектурных рекомендаций REST, но я чувствую, что я пропустил лодку полностью, пытаясь это сделать. Я понимаю, что разработка надлежащих API REST и клиентов не является «легкой», но мне кажется, что мне очень нужен аналогичный пример для работы с фактической реализацией.
Приносим извинения за длину и многословие вопроса и неизбежное выражение лица изуродованных читателей.
Последующая деятельность:
Является ли следующий правильный путь (используя шаблоны URI) реализации этих взаимодействий? Для демонстрационных целей (вместо более абстрактной реализации), другой вид Django, чтобы получить элемент коллекции ресурсов:
def get_item(request, service_name, item_id):
doc = etree.parse(urllib.urlopen('http://example.com/services/'))
uri = doc.xpath("service/name[.='%s']/following-sibling::item_link" % service_name)[0].text
...
Тогда последующий запрос:
GET example.com/services/widgets/1 HTTP/1.1
HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<widget>
<id>1</id>
<name>Whizbang Foobar</name>
<tags>foo bar baz ham eggs</tags>
<index_link>http://example.com/services/widgets/</index_link>
</widget>
Спасибо за этот четкий ответ. Облачный API и его ориентация на типы медиа значительно улучшили мое понимание. В качестве продолжения использовались бы шаблоны URI в медиаресурсе «Индекс» ресурса как правильный способ обнаружения «элементов» ресурса (см. Редактирование вопросов и последующее наблюдение)? – user150093
Возможно, хотя я не уверен, что это необходимо. Как насчет того, чтобы указать тип носителя Index, который включает (разбитый на страницы) список ссылок на объекты? Ссылки для разбивки на страницы, так же как и с HTML-представлением, могут использоваться для направления клиента через список «Элементы». –
@ m0nikr: обычно это не стоит, потому что браузеры все равно используют сжатие gzip, что сделает ненужным оптимизацию на этом уровне. Просто включите полные URI. – aehlke