我正在实现一个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>
优点:
缺点:
/book/123
还有一个带有图书内容的标记,以便在线阅读该怎么办? 选项2 :
向/books/123/author
发送数据发出HTTP PUT方法:
<?xml version="1.0" encoding="utf-8"?>
<author>G. Robinson</author>
优点:
缺点:
因此,总结一下,我的问题是,是否有任何公认的约定来公开Web服务中的信息。当然,在管理少量数据的简单Web服务中,这不是问题,但如果我们公开现实世界的数据库呢?
非常感谢你。
答案 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。