У меня, кажется, довольно простой вопрос о реализации клиента доступа к данным, который строго придерживается архитектурных принципов REST. Для начала предположим, что у меня есть хорошо работающий REST API, который я хочу использовать с помощью приложения Django. Начну с того, что узнаю, какие услуги доступны (отредактировано для последующего наблюдения) :
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, как я продолжу исследовать эти сервисы RESTful? Чтобы придерживаться принципов 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. Отсюда, однако, как мне продолжать взаимодействовать с этим сервисом RESTful? Возможно, я запутался в замешательстве, но единственные разумные вещи, которые я могу придумать, - это реализация большого количества представлений приложений или тонкой модели данных 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>