我有一个关于实现严格遵守 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 和客户端并不“容易”,但似乎我迫切需要一个类似的示例来完成实际的实现。
对于这个问题的冗长和冗长以及不可避免的枯萎读者的捂脸,我深表歉意。
跟进:
以下是实现这些交互的有效方法(使用 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>