如果DELETE不可能,则为REST HTTP状态代码

Mat*_*att 43 rest http-status-codes

当资源上无法进行DELETE(但不涉及用户权限)时,我的问题是关于HTTP状态代码的非常通用的问题.

我们在一种资源上有一个RESTful API.

DELETE方法被授权的资源,但有些条件下的资源不能被删除下(如果有绑定到该资源数据).

在这种情况下,返回客户端的正确HTTP状态代码是什么?

以下是我收集的一些可能性以及为什么它在我的案例中似乎不合适:

  • 403(禁止):似乎主要与用户的权利有关.
  • 405(不允许的方法):似乎API不是为这种类型的资源响应此方法而设计的.
  • 409(冲突):似乎合适,但客户应该有可能解决与API的冲突,但这不是这种情况.

更新:无法通过REST API更改阻止资源被删除的数据绑定.但是,资源可以通过其他方式"释放",因为数据所来自的数据库也可以被其他应用程序访问,这些应用程序可能会更改资源的状态(DB中的SQL DELETE总是可以这样做).

E-R*_*Riz 29

我认为409是最合适的,因为它在RFC中的措辞:

409(冲突)状态代码表示由于与目标资源的当前状态冲突而无法完成请求.此代码用于用户可能能够解决冲突并重新提交请求的情况.服务器应该生成一个有效载荷,其中包含足够的信息供用户识别冲突源.

(强调我的)

根据我对问题描述的理解,不允许DELETE的原因与目标资源的当前状态完全冲突.如RFC中所示,响应有效载荷可以指示原因,并且可选地,用户可能能够解析它.我没有看到规范中的任何内容使409不合适只是因为API不提供冲突解决的可能性.

  • 我看到"可能"这个词,并且读到这意味着这是使用409的可选条件.但是,我同意你的其他评论,如果资源永远不能从它的"数据绑定"中"释放"那么405将是适当.让我们看看OP说的是什么...... (3认同)
  • 对我来说,关键句是"此代码用于用户可能能够解决冲突并重新提交请求的情况." 如果冲突没有被解决的可能性,这句话暗示409不是正确的代码. (2认同)

Eri*_*ein 16

409 Conflict,如果客户端无法解析冲突,后来删除请求响应肯定是不对的.也就是说,除非资源具有状态跟踪是否可以删除,否则不409 Conflict适合.

403 Forbidden并不一定意味着没有授权:

但是,出于与凭证无关的原因,可能会禁止请求.
   - RFC 7231

但这意味着通常存在.您可以使用此代码,但可能会引起一些混淆.如果方法实际上也需要授权,那将特别棘手 - 您需要在响应中使用代码或其他内容来指示失败是与授权相关还是资源是不可删除的.

我认为这405 Method Not Allowed是正确的方法.

405(方法不允许)状态代码表示请求行中接收的方法由源服务器知道但目标资源不支持.
   - RFC 7231

此资源不支持DELETE方法.这听起来就像你所描述的那样.HTTP规范实际上没有一种资源的概念 - 只是一种资源.碰巧人们将相同端点下的个人资源分组以获得理智,但这对开发人员和用户来说只是一种便利.至于HTTP规范而言,/widgets/12/widgets/15/widgets/3453三种不同的资源.同一个对象代表服务器上所有这三个资源的事实完全无关紧要.我认为这是你想到的"类型",但对于HTTP来说这只是一个实现细节.

  • 在这种情况下,我不太确定405是最好的响应,主要是因为默认情况下它是可缓存的.因此,客户端将接收405并对其进行缓存,因此"假设"不允许的结果是静态或永久响应.然而,鉴于OP的描述,资源的可删除性可能会发生变化.如果响应是405,客户端如何知道? (6认同)