在Web服务中应该将哪些级别的信息雾化?

时间:2013-10-20 07:47:03

标签: database rest service web

我正在实现一个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服务中,这不是问题,但如果我们公开现实世界的数据库呢?

非常感谢你。

2 个答案:

答案 0 :(得分:2)

远程接口(如webservices)通常是粗粒度的。这可以最大限度地减少网络开销。

使用数据

/books/123发出HTTP PUT
<?xml version="1.0" encoding="utf-8"?>
<book>
    <author>G. Robinson</author>        
</book>
在我看来,这本书似乎没有<title><year>了。您投放到/books/123的数据应包含所有相关信息,即使是那些没有更改的信息。

使用数据

/books/123/author发出HTTP PUT
<?xml version="1.0" encoding="utf-8"?>
<author>G. Robinson</author>

是您期望从本地接口而不是远程接口获得的细粒度控件。如果使用粗粒度界面一次更新整本书籍数据非常昂贵(例如,如果书籍数据还包含书籍的全文而您经常只需要更新一个属性),那么除了粗粒度界面外,还可以使用它。

答案 1 :(得分:1)

我相信你可以同时拥有两者,具体取决于你想要支持的客户需求/情况:

  • GET/POST /books/123:您获取并发布(创建/更新)完整的图书属性
  • GET/POST /books/123/author:您获取并发布(创建/更新)本书的作者

没有理由不能同时使用这两个选项。客户可以根据他们的情况来跟随其中一个...选项1似乎更适合创建新书条目或更新整个条目...而选项2如果您在客户端UI中允许更新一次“一个财产”。因此,这可能在很大程度上取决于您想要支持的客户“意图”/情况......您在制作设计时应该考虑到这一点。

我刚刚阅读了一篇关于InfoQ的文章,其中涉及了其中的一些要点(其中包括)。请查看“不要公开您的域模型”和“根据意图设计您的API”点 - http://www.infoq.com/news/2013/10/gotober-do-dont-webapi