【发布时间】:2014-01-23 10:15:33
【问题描述】:
我在处理系统的 REST API 时提出了以下映射,用户可以在该系统中创建和管理不同类型的资源。
// READ OPERATIONS
GET /objects => read collection meta
GET /objects/[id] => read single element
GET /objects/?[query] => read a number of elements
GET /objects/?all => read all elements
// CREATE / UPDATE OPERATIONS
PUT /objects => possibly create the collection and update its meta
PUT /objects/[id] => possibly create and update a single element
PUT /objects/?all => update the entire content of the collection
POST /objects => create new objects or update existing objects
PATCH /objects => partially update the collection meta
PATCH /objects/[id] => partially update a single element
PATCH /objects/?all => partially update all the elements
PATCH /objects/?[query] => partially update a number of elements
// DELETE OPERATIONS
DELETE /objects => delete the collection
DELETE /objects/[id] => delete a single element
DELETE /objects/?all => empty the collection
DELETE /objects/?[query] => delete a number of elements
这里有一些关于系统的更多信息:
- 每个资源既可以是简单资源,也可以是类似集合的资源;
- 每个资源,不管是否是集合,都有自己的属性需要访问和操作;
- API 必须支持批量(而非批量)操作。
我还研究了以下替代方案:
- 使用
/collection访问集合的元素集,使用/collection?meta访问集合自身的数据; - 使用全新资源访问集合自己的数据,例如
/collections/path/to/collection。
我不喜欢替代 n。 1)因为在我看来,它在语义上很差。相比之下,当我提到一个盒子时,我实际上指的是盒子本身,而不是它的内容。
我不喜欢替代 n。 2) 因为一个资源最终将自己的数据暴露给另一个资源,复制 url 并使“我应该使用哪个 url”的问题不像我希望的那样微不足道。
因此,我的问题:
- 我为 REST API 提出的映射是否有效、正确?是否尊重 REST 原则?我不是在问它是否是最好的映射。我在问它的有效性。
- 如果不是,哪一种方案更好,为什么?
请原谅我的英语,我不是该语言的母语人士。
【问题讨论】:
-
你的英语很棒。你的 API 设计也不错:)
-
也许我应该为我的评论提出一个问题,但我想知道“PUT”和“PATCH”之间的区别。在服务器中,您将在每个操作中执行哪些操作?我问是因为它们看起来非常接近。以编程方式它们有什么不同?
-
@BrianKelly:谢谢伙计!
-
@edubriguenti:PATCH 允许部分更新(PUT 始终需要整个资源主体)。而且,它既不是幂等的,也不是安全的(PUT 是幂等的)。恕我直言,PATCH 更适合批量更新,您只想更新特定资源集中的给定属性子集。这同样适用于 POST 与 PUT。我认为不应该使用幂等方法进行批量更新。
-
@BrianKelly:将您的评论转化为答案,以便我将其标记为已接受。
标签: http rest url mapping bulk-operations