我有什么似乎是有关实现严格符合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>
现在,因为我建立根据各地消费这个API Django应用程序,我将如何继续保持REST风格探索这些服务? 要坚持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模板部件的简单列表。 从这里,虽然,我该如何继续使用此服务REST风格交互? 也许,我迷迷糊糊地扑进混乱,但唯一合理的事情,我能想出正在实施的应用视图的众多量或薄Django的数据模型,以坚持服务URI。
我最关心的归结为,这是微不足道的,而不严格遵守REST架构准则的事,但我觉得我已经错过了船完全试图这样做。 我理解正确设计的REST API和客户端不“易”,但似乎我迫切需要一个类似的例子,通过实际执行工作。
我对这个问题的长度和冗长和干瘪的读者必然facepalming道歉。
跟进:
在下面的实现这些交互的有效方式(使用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>