当我想要删除资源和子资源或者仅仅删除资源时,如何正确地使RESTAPI端点?

当我想要删除资源和子资源或者仅仅删除资源时,如何正确地使RESTAPI端点?,rest,Rest,在我的系统中,我有两个资源包和债务,包可以包含多个债务。现在,我准备删除包的api资源,但我需要有两个可用选项: 删除包和相关的债务-执行此操作后,删除的资源将在系统中不可见 在这里,我正在考虑简单的router.delete('/packages/:token') 删除文件包但取消绑定相关的债务-执行此操作后,文件包将被删除,但债务将被更新为与已删除文件包的松散连接,并且债务将在系统中用于其他操作 在这里我遇到了一个问题,我想创建post端点,并在路径中执行操作,类似于,router.

在我的系统中,我有两个资源
债务
可以包含多个
债务
。现在,我准备删除
包的api
资源,但我需要有两个可用选项:

  • 删除
    和相关的
    债务
    -执行此操作后,删除的资源将在系统中不可见
在这里,我正在考虑简单的
router.delete('/packages/:token')

  • 删除
    文件包
    但取消绑定相关的
    债务
    -执行此操作后,
    文件包
    将被删除,但
    债务
    将被更新为与已删除文件包的松散连接,并且
    债务
    将在系统中用于其他操作
在这里我遇到了一个问题,我想创建
post
端点,并在路径中执行操作,类似于,
router.post('/packages/:token/remove/unpin')
。但它可能不是最好的RESTAPI


我希望,这是清楚的。感谢您提供的帮助/建议。

因此,在阅读了这篇漂亮的文章之后,我决定创建类似于
路由器的端点。delete('/packages/:token/unpin')
,这将告诉我需要删除包,但
unpin
操作将提示我在删除包之前需要取消绑定债务

在提到我的问题的帖子中有一个很好的部分:

那些不适合CRUD操作世界的操作呢?

这就是事情变得模糊的地方。有许多方法:

  • 重新构造操作,使其看起来像资源的字段。如果操作不采用参数,则此操作有效。例如,激活操作可以映射到布尔激活字段,并通过资源补丁进行更新
  • 将其视为具有RESTful原则的子资源。例如,GitHub的API允许使用
    PUT/gists/:id/star
    启动gist,使用
    DELETE/gists/:id/star
    取消启动gist
  • 有时候你真的没有办法将动作映射到一个合理的RESTful结构。例如,将多资源搜索应用于特定资源的端点实际上没有意义。在这种情况下,
    /search
    最有意义,即使它不是资源。这没关系——只要从API使用者的角度做正确的事情,并确保清楚地记录下来,以避免混淆

  • 因此,在阅读了这篇漂亮的文章之后,我决定创建这样的端点
    router.delete('/packages/:token/unpin')
    ,这将告诉我需要删除包,但
    unpin
    操作将提示我需要在删除包之前取消绑定债务

    在提到我的问题的帖子中有一个很好的部分:

    那些不适合CRUD操作世界的操作呢?

    这就是事情变得模糊的地方。有许多方法:

  • 重新构造操作,使其看起来像资源的字段。如果操作不采用参数,则此操作有效。例如,激活操作可以映射到布尔激活字段,并通过资源补丁进行更新
  • 将其视为具有RESTful原则的子资源。例如,GitHub的API允许使用
    PUT/gists/:id/star
    启动gist,使用
    DELETE/gists/:id/star
    取消启动gist
  • 有时候你真的没有办法将动作映射到一个合理的RESTful结构。例如,将多资源搜索应用于特定资源的端点实际上没有意义。在这种情况下,
    /search
    最有意义,即使它不是资源。这没关系——只要从API使用者的角度做正确的事情,并确保清楚地记录下来,以避免混淆