【问题标题】:What is the appropriate http response code for a DELETE that depends on something else?取决于其他内容的 DELETE 的适当 http 响应代码是什么?
【发布时间】:2014-11-03 12:29:17
【问题描述】:

假设我想做DELETE /groups/20,并且我的业务规则规定您不能删除一个组,只要它有成员。

  • 如果 DELETE 成功,我会返回 200204
  • 如果第 20 组不存在,我会返回 404
  • 如果用户未通过身份验证,我会返回401
  • 如果用户已通过身份验证但没有第 20 组的权限,我将返回 403
  • 如果组 20 存在,用户已通过身份验证,请求正常,但您不能删除组 20,因为它包含成员?

在这种情况下你会返回什么? 400?但是语法是完美的。 403?嗯,是的,这是被禁止的,但是403 的一般意思是“没有权利执行这个动作”,而不是“你有权利,但是某些先决条件未满足,请处理好这些先决条件,然后再回来。”

【问题讨论】:

  • 可能是409 Conflict?
  • 删除冲突?似乎很奇怪。 409 似乎更多地保留用于双重创建某些东西,例如如果name 必须是唯一的,并且您创建一个与现有项目同名的项目,或者将名称更新为与现有项目相同。
  • @Mat 否,因为412 是“服务器不满足请求者对请求提出的先决条件之一。”
  • @Mat 很有趣。我喜欢它作为一个想法,但它真的是为了这个吗?我认为这是针对显式标头的,例如“如果某些条件显式为真,则删除此资源”
  • @Tichodroma 是的,看起来你是对的。见stackoverflow.com/questions/5369480/…

标签: rest


【解决方案1】:

如果用户能够通过删除成员并再次尝试删除组来更正请求,您应该返回409 ConflictRFC 7231 说:

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

您在 cmets 上说过,409 Conflict 似乎更多地被保留用于双重创造某些东西,但“似乎保留”几乎是矛盾的。如果某些内容被保留,RFC 通常会非常明确地说明它并使用关键字 MUST。 RFC 7231 提到了由于 PUT 请求而导致的冲突编辑的情况是更常见的情况,但没有任何地方说状态代码是为此保留的。

在响应 PUT 请求时最有可能发生冲突。例如,如果正在使用版本控制并且被 PUT 的表示包含对资源的更改,该更改与早期(第三方)请求所做的更改相冲突,则源服务器可能会使用 409 响应来指示它无法完成要求。在这种情况下,响应表示可能包含有助于根据修订历史合并差异的信息。

【讨论】:

  • 我喜欢这个。如果您将“冲突”解释为“状态冲突”而不是“资源冲突”,那么这是有道理的。谢谢!
猜你喜欢
  • 2013-06-20
  • 2012-03-11
  • 2018-04-26
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多