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

时间:2018-01-30 11:02:22

标签: rest restful-architecture api-design

说我有以下数据的关系结构(例如)

A `post` which is a child of a `category`

可以通过这些API端点访问此数据:

  • GET /category/1
  • GET /category/1/post/1
  • GET /category/1/post/2

我现在决定要使用我的API删除category 1,以便运行DELETE /category/1

但是,category 1有关系子post元素,如果没有该类别就不能存在,你是否希望这个调用失败并说你必须先删除子元素或者当你自动递归删除子元素删除类别?

4 个答案:

答案 0 :(得分:3)

IMO这更像是一个设计决策而且他们真的没有错误的做法。所以这一切都取决于要求。

如果您决定删除某个类别会删除所有子帖子元素,那么您可以通过多种方式执行此操作(按我的喜好排序)。

  • 控制级联在数据库中删除。
  • 在DAL图层中添加代码,以便在调用类别时删除该类别下的所有帖子。

如果您决定不执行"级联"删除子帖子,然后您唯一的选择是返回一条相应的错误消息,说明无法删除该类别的原因。

如果您愿意,可以通过执行此类操作来更清楚地了解对Web服务的调用。

DELETE / category / 1?includePost = true - >删除类别#1&所有帖子都在它之下。

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

答案 1 :(得分:2)

我会说当你DELETE类别时它会成功。

让我们说,它失败了 - 那么你需要GET所有帖子和评论然后用DELETE迭代它们 - 这是什么意思?

另外,我会使用plural nouns进行资源命名,如:

GET /categories/1/posts

获取所有帖子时,它看起来会更加一致。

但是,无论是否有级联,它都取决于您如何实施它 - 看看哪种更适合您的需求。

答案 2 :(得分:2)

<强> 1。命名

  • 我会使用plural form/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

    删除所有属于1

  • 类别的帖子
  • DELETE /categories/1

    • 如果 /categories/1是空的&#39;

      只需删除一个类别类型的实体。

    • 如果 /categories/1并非空白&#39;

      返回HTTP 405 Method Not Allowed并要求用户先运行DELETE /posts?filter=category:1清空/categories/1

  • OPTIONS categories/1
    • 如果 categories/1是空的&#39;

      ALLOW设置为GET,...,DELETE

    • 如果 categories/1并非空白&#39;

      ALLOW设置为GET,...(不允许DELETE

  • DELETE /posts/1

    删除帖子以及引用它的所有评论或使用与DELETE categories/1相同的模式

  • DELETE /comments/1

    仅删除评论。

<强> 4。查找更多信息

Which HTTP status code to return when the DELETE operation is not allowed for particular reason

答案 3 :(得分:-1)

您可以在休息

中执行这些操作

&#34;方法&#34;:[     &#34; GET&#34 ;,     &#34; POST&#34 ;,     &#34; PUT&#34 ;,     &#34; PATCH&#34 ;,     &#34; DELETE&#34; ],

我可以通过DELETE / categories / 1 / post来做这件事,所以应该遵循命名。