(for example sake):
A `post` which is a child of a `category`
这些API端点可以访问这些数据:
GET /category/1
GET /category/1/post/1
GET /category/1/post/2
类别1
,因此我运行DELETE /category/1
。然而,
类别1
有关联的子文章元素,如果没有这个类别就无法存在,你会期望这个调用会失败并说你必须先删除子元素,或者在删除类别时自动递归删除子元素吗?(for example sake):
A `post` which is a child of a `category`
GET /category/1
GET /category/1/post/1
GET /category/1/post/2
类别1
,因此我运行DELETE /category/1
。类别1
有关联的子文章元素,如果没有这个类别就无法存在,你会期望这个调用会失败并说你必须先删除子元素,或者在删除类别时自动递归删除子元素吗?在我看来,这更多是一个设计决策,没有错误的做法。因此,所有取决于需求。
如果您决定删除类别会删除所有子帖子元素,则可以以多种方式执行此操作(按我的首选顺序排序)。
如果您决定不对子帖子执行“级联”删除,则您唯一的选择是返回适当的错误消息,说明为什么无法删除该类别。
如果您希望通过执行以下操作之一使Web服务调用更加清晰,请这样做。
DELETE /category/1?includePost=true --> 删除第1个类别和其下的所有帖子。
DELETE /category/1 --> 删除第1个类别或如果无法删除则返回错误信息。
当你使用DELETE
删除类别时,我认为它应该成功。
假设它失败了-那么你需要使用GET
获取所有帖子和评论,然后使用DELETE
迭代它们-这有什么意义呢?
另外,我会使用复数名词来命名资源,例如:
GET /categories/1/posts
1. 命名
/categories
,/posts
,/comments
/categories
不是一个好的名称,因为它允许从数据库中递归删除大量实体。我会使用像 /sections
,/areas
或 /partitions
这样的名称。DELETE /categories
的东西,比如DELETE /posts?filter=category:1
2. 路由
我会考虑使用更加扁平化的结构来处理 http 路由,并为每个实体创建独立的端点。
为以下内容提供 CR
(创建、读取):
GET,POST /categories
GET,POST /posts
GET,POST /comments
然后为单个实体提供RUD
(读取、更新、删除)功能。
GET,PUT,DELETE /categories/1
GET,PUT,DELETE /posts/1
GET,PUT,DELETE /comments/4
DELETE
。
3. 实施
示例
DELETE /posts?filter=category:1
删除所有属于分类 ID 为 1
的帖子。
DELETE /categories/1
/categories/1
是空的 只删除一个类型为 category 的实体。
/categories/1
不为空 返回 HTTP 405 Method Not Allowed 并要求用户先运行 DELETE /posts?filter=category:1
来清空 /categories/1
。
OPTIONS categories/1
DELETE /posts/1
删除帖子及所有引用它的评论,或者使用与 DELETE categories/1
相同的模式。
DELETE /comments/1
仅删除该评论。
4. 查找更多信息
你可以在Rest中执行以下操作:
"methods": [ "GET", "POST", "PUT", "PATCH", "DELETE" ],
我可以通过DELETE /categories/1/post 来进行此操作,所以命名应该遵循规范。
GET /category/1
(获取所有),那么你也应该能够调用DELETE /category/1
(删除所有)。 - dieter