在RESTful API中,DELETE调用应该递归吗?

17 浏览
0 Comments

在RESTful API中,DELETE调用应该递归吗?

假设我有以下的数据关系结构(为了举例):\n一个`category`的子级是`post`\n这些数据可以通过以下API端点访问:\n

    \n

  • GET /category/1
  • \n

  • GET /category/1/post/1
  • \n

  • GET /category/1/post/2
  • \n

\n现在,我决定使用API删除category 1,因此运行DELETE /category/1。\n然而,category 1有关联的子级post元素,如果没有category,它们将无法存在。你会期望这个调用失败并告诉你必须先删除子元素,还是在删除category时自动递归删除子元素?

0
0 Comments

在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

0
0 Comments

在RESTful API中,DELETE调用是否应该是递归的?

在RESTful API中,DELETE调用应该在删除类别时成功。假设删除操作失败了,那么你需要使用GET调用获取所有的帖子和评论,然后使用DELETE调用对它们进行迭代删除 - 这样做有什么意义呢?

此外,我会在资源命名中使用复数名词,比如:GET /categories/1/posts。这样在获取所有的帖子时看起来更加一致。

然而,如何实现是由你决定的,可以选择是否级联删除 - 看哪种方式更适合你的需求。

0
0 Comments

在一个RESTful API中,DELETE调用是否应该是递归的?

这个问题的出现原因是因为在设计API时,需要考虑删除操作的行为。根据具体的需求,可以有不同的解决方法。

如果决定删除一个类别时同时删除所有子帖子元素,可以有多种方式实现(按照我的偏好排序):

- 在数据库中控制级联删除。

- 在数据访问层(DAL)中添加代码,当调用一个类别时,删除该类别下的所有帖子。

如果决定不对子帖子进行"级联"删除,那么唯一的选择就是返回一个适当的错误消息,说明为什么无法删除该类别。

如果希望通过调用Web服务的方式更清楚地说明其功能,可以采用以下形式:

DELETE /category/1?includePost=true --> 删除类别#1及其所有帖子。

DELETE /category/1 --> 删除类别#1,如果无法删除则返回错误。

在设计RESTful API时,是否应该对DELETE调用进行递归操作取决于具体的需求。可以通过在数据库中进行级联删除或在代码中处理来实现递归删除,或者根据需求返回适当的错误消息。

0