在RESTful API中,DELETE调用应该递归吗?
在RESTful API中,DELETE调用应该递归吗?
假设我有以下的数据关系结构(为了举例):\n一个`category`的子级是`post`
\n这些数据可以通过以下API端点访问:\n
- \n
GET /category/1
GET /category/1/post/1
GET /category/1/post/2
\n
\n
\n
\n现在,我决定使用API删除category 1
,因此运行DELETE /category/1
。\n然而,category 1
有关联的子级post元素,如果没有category,它们将无法存在。你会期望这个调用失败并告诉你必须先删除子元素,还是在删除category时自动递归删除子元素?
在RESTful API中,DELETE调用是否应该递归删除?
在RESTful API中,通常使用复数形式的命名,比如/categories、/posts、/comments。但是对于允许递归删除数据库中大量实体的情况,/categories并不是一个好的命名。可以考虑使用/sections、/areas或/partitions等命名。
此外,可以提供类似于DELETE /posts?filter=category:1的方式来删除特定类别下的所有帖子。而不是使用DELETE /categories来删除整个类别。
对于路由,可以考虑使用更扁平的结构,为每个实体创建独立的端点。例如,提供CR(create、read)操作的端点如下:
GET、POST /categories
GET、POST /posts
GET、POST /comments
然后为单个实体提供RUD(read、update、delete)操作的端点如下:
GET、PUT、DELETE /categories/1
GET、PUT、DELETE /posts/1
GET、PUT、DELETE /comments/4
这样做可以使使用更直观,不会暗示某种层次结构或特定行为。然后在每个实体上定义适当的DELETE操作。
对于实现,可以根据以下示例进行处理:
DELETE /posts?filter=category:1:删除属于类别ID为1的所有帖子。
DELETE /categories/1:
- 如果/categories/1为空,只需删除一个类别实体。
- 如果/categories/1不为空,返回HTTP 405 Method Not Allowed,并要求用户首先运行DELETE /posts?filter=category:1来清空/categories/1。
OPTIONS categories/1:
- 如果categories/1为空,将ALLOW设置为GET、...、DELETE。
- 如果categories/1不为空,将ALLOW设置为GET、...(不允许DELETE)。
DELETE /posts/1:删除帖子及其所有引用的评论,或者可以使用与DELETE categories/1相同的模式。
DELETE /comments/1:仅删除评论。
通过上述方式,可以解决DELETE调用是否应该递归删除的问题。
参考链接:Which HTTP status code to return when the DELETE operation is not allowed for particular reason
在一个RESTful API中,DELETE调用是否应该是递归的?
这个问题的出现原因是因为在设计API时,需要考虑删除操作的行为。根据具体的需求,可以有不同的解决方法。
如果决定删除一个类别时同时删除所有子帖子元素,可以有多种方式实现(按照我的偏好排序):
- 在数据库中控制级联删除。
- 在数据访问层(DAL)中添加代码,当调用一个类别时,删除该类别下的所有帖子。
如果决定不对子帖子进行"级联"删除,那么唯一的选择就是返回一个适当的错误消息,说明为什么无法删除该类别。
如果希望通过调用Web服务的方式更清楚地说明其功能,可以采用以下形式:
DELETE /category/1?includePost=true --> 删除类别#1及其所有帖子。
DELETE /category/1 --> 删除类别#1,如果无法删除则返回错误。
在设计RESTful API时,是否应该对DELETE调用进行递归操作取决于具体的需求。可以通过在数据库中进行级联删除或在代码中处理来实现递归删除,或者根据需求返回适当的错误消息。