假设我想创建一个RESTful接口,我想根据他们的ID使用variable tut_counter : integer range 0 to 90 := 0; -- counts tutorial time
。这里没有新东西:
foo
返回GET /api/foo1
。foo1
删除DELETE /api/foo1
。等
现在让我告诉你,“foo”是一个集合类型的东西。所以我希望能够在“foo”中添加“bar”:
foo1
将PUT /api/foo1/bar3
添加到bar3
。foo1
返回GET /api/foo1/bar3
。foo1
从DELETE /api/foo1/bar3
移除bar3
。foo1
完全删除DELETE /api/foo1
。现在问题仍然存在:foo1
做了什么?它是否只是返回GET /api/foo1
的表示,就像我最初在这个问题中所假设的那样?还是它会返回一个条形列表?或者它是否返回foo1
的表示形式,既是foo1
的描述,又是包含所有包含条形的列表?
或者foo1
应该只返回我在开头假设的GET /api/foo1
的表示形式,并且需要foo1
请求列出PROPFIND
内的条形图(采用的方法)通过WebDAV)?但是为了保持一致,我不必将所有其他列表类型功能更改为foo1
,直接与使用PROPFIND
列出内容的数千个RESTful教程相矛盾?
答案 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来检索集合的成员。
所以你应该这样做:
如果您告诉他们使用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是一个开源项目,请为每个路径制作干净清晰的文档。
不要浪费你的时间思考旧学校的策略。