【发布时间】:2013-10-20 07:47:02
【问题描述】:
我正在实现一个 REST Web 服务,我想知道是否有任何关于如何将服务公开的信息原子化的约定。到目前为止,我一直无法找到令人满意的解决方案,所以现在我向互联网上最伟大的人提问:P
例如,假设我想实现一个 API 来访问某种库注册表,所以我们有一个路径为 /books 的资源。例如,通过阅读/books/123,我们将获得以下 XML 数据:
<?xml version="1.0" encoding="utf-8"?>
<book>
<title>Visit Catalonia</title>
<author>J. Hans</author>
<year>2000</year>
</book>
假设作者信息有误,我想通过 Web 服务的 API 更改它。我提出了两种可能的选择,每种都有优点和缺点:
选项 1:
使用以下数据向/books/123 发出 HTTP PUT 方法:
<?xml version="1.0" encoding="utf-8"?>
<book>
<author>G. Robinson</author>
</book>
优点:
- 只需要实现 1 个资源处理程序:/books/BOOKID
- 我们可以修改数据中定义的 XML 标记的尽可能多的信息(例如:添加上面的代码,我们也会更新图书的年份)。
缺点:
- GET 方法总是返回关于一本书的所有数据;我们不能只访问一条信息。在此示例中,获取所有数据不是问题,但如果
/book/123也有一个带有图书内容本身的标签以便在线阅读呢?
选项 2:
向/books/123/author发出HTTP PUT方法发送数据:
<?xml version="1.0" encoding="utf-8"?>
<author>G. Robinson</author>
优点:
- 可以以任意深度访问信息:API 客户端只需下载他/她需要的信息。
缺点:
- 我们无法通过单个 HTTP 请求获取或修改多条信息。
- 实施起来很困难:子资源与信息字段一样多。
因此,总而言之,我的问题是是否有任何普遍接受的约定可以在 Web 服务中公开信息。当然,在管理少量数据的简单 Web 服务中,这不是问题,但如果我们公开真实世界的数据库怎么办?
非常感谢您。
【问题讨论】:
-
我很困惑。您的 PUT 请求与您的问题有什么关系?
-
这只是一个访问资源的例子。我要问的是应该沿着网络资源稀疏到什么程度的深度信息。换句话说:创建少量资源来检索或写入大量数据还是创建许多资源来检索/写入少量数据更好?
-
啊,好的。我不认为有一个好的答案。我认为您需要根据使用情况进行优化。我倾向于从大量资源开始,并在它们之间进行更多导航,如果这有助于优化,用户可以选择传递参数以内联(即嵌入)一些资源。