返回也是集合的资源表示的最佳实践

时间:2016-11-06 15:24:27

标签: rest get webdav

假设我想创建一个RESTful接口,我想根据他们的ID使用variable tut_counter : integer range 0 to 90 := 0; -- counts tutorial time。这里没有新东西:

  • foo返回GET /api/foo1
  • 的表示(例如,使用JSON)
  • foo1删除DELETE /api/foo1

现在让我告诉你,“foo”是一个集合类型的东西。所以我希望能够在“foo”中添加“bar”:

  • foo1PUT /api/foo1/bar3添加到bar3
  • foo1返回GET /api/foo1/bar3
  • 的表示形式
  • foo1DELETE /api/foo1/bar3移除bar3
  • foo1完全删除DELETE /api/foo1

现在问题仍然存在:foo1做了什么?它是否只是返回GET /api/foo1的表示,就像我最初在这个问题中所假设的那样?还是它会返回一个条形列表?或者它是否返回foo1的表示形式,既是foo1的描述,又是包含所有包含条形的列表?

或者foo1应该只返回我在开头假设的GET /api/foo1的表示形式,并且需要foo1请求列出PROPFIND内的条形图(采用的方法)通过WebDAV)?但是为了保持一致,我不必将所有其他列表类型功能更改为foo1,直接与使用PROPFIND列出内容的数千个RESTful教程相矛盾?

3 个答案:

答案 0 :(得分:3)

经过一番思考后,我认为从RESTful角度来看,最好的概念解释是,“东西”通常与其“集合”不同。因此,在WebDAV世界中,directory/可能与保存其文件的内容相同,在RESTful世界中,我可能为所包含的文件设置了单独的directory/files/子路径。这样我就可以与保存的文件分开操作目录。

考虑包含谷仓的服务器场的RESTful API。端点farm/api/barns/可能会返回一个谷仓列表,其中一个将是farm/api/barns/bigredbarn。天真的我会认为检索farm/api/barns/bigredbarn/会为我提供一个谷仓里的动物清单,这就是提出这个问题的原因。

但实际上,谷仓里的动物只是大红谷仓的一个方面。它可能包含车辆和干草:

  • farm/api/barns/bigredbarn/animals/
  • farm/api/barns/bigredbarn/vehicles/
  • farm/api/barns/bigredbarn/haybales/

通过这种方法,我所面临的困境不会出现。

答案 1 :(得分:2)

webdav的语义从未真正与RESTful接口的习语相协调。

理论上,GET应该检索资源状态的表示,并且应该使用PROPFIND来检索集合的成员。

所以你应该这样做:

  • GET / api / foo1 / - 仅返回foo1的状态
  • PROPFIND / api / foo1 / - 返回foo1
  • 的成员

如果您告诉他们使用PROPFIND,大多数前端开发人员都会感到害怕,尽管它在浏览器js实现中完全支持。

我个人使用webdav / json网关,其中请求是使用RESTful习语,但是路由到我的webdav实现

例如我会这样做:

GET /api/foo1/_PROPFIND?fields=name,fooProp1,fooProp2

那会返回

[
{ name : "bar1", fooProp1: "..", fooProp2 : ".."},
{ name : "bar2", fooProp1: "..", fooProp2 : ".."}
]

这种方法的一个优点是客户端可以控制返回的json属性。这很好,因为丰富的API将具有很多属性,但在大多数情况下,客户端不需要所有这些属性。

答案 2 :(得分:1)

RESTfull API中的路由及其操作完全由开发人员设计。开发人员在请求特定路线时决定要返回什么,例如GET /api/foo1

开发人员应设计包括/api/foo1/bar在内的每条路线。关于特定路线应该做什么没有具体规则。如果您的API是一个开源项目,请为每个路径制作干净清晰的文档。

不要浪费你的时间思考旧学校的策略。