HTTP状态代码混淆

时间:2014-06-30 13:13:16

标签: rest http status

所以,我试图显示有意义且准确的HTTP状态代码,即使在线完成示例后我也感到困惑。这是我的情况:

在接受查询参数的URL中:

@POST query
Sample URL: /putRecord?Name=A&Age=25&house=permanent
  1. 当其中一个参数丢失时,我会返回什么状态代码? (所有3都是强制性的) - 从我读过的内容来看,我猜这是一个400:不好的请求。但这似乎太笼统了。有没有办法让我说查询格式错误?来源:here
  2. 假设我针对数据库验证重复项的名称,如果我得到重复项,我会返回什么状态代码?
  3. 因此,如果已有重复条目,我无法添加记录。我是否显示304(未修改)或仅显示2的错误代码? 澄清:对于3,另一种可能性是当我无法实际承诺DB和我回滚(可能)。现在的状态代码是什么?

    非常感谢!

1 个答案:

答案 0 :(得分:2)

广告1.除了代码本身(400)之外,您还可以返回带有说明的短消息。因此,而不是退回" 400 Bad Request"您可以回复" 400查询参数名称和#34;或类似的东西。此消息称为"原因短语"并定义为in 6.1 in RFC 2616。或者,如果您需要更多灵活性,可以返回带有解释的文档。

广告2.我会考虑使用422 Unprocessable实体。来自RFC 4918

  

422(不可处理实体)状态代码表示服务器了解请求实体的内容类型,并且请求实体的语法正确(因此400(错误请求)状态代码不合适)但无法处理包含的说明。

广告3.我会返回422,但这实际上取决于这种情况是否被视为逻辑中的错误,还是常规的预期情况。

编辑:正如@ War10ck在评论中建议的那样,HTTP 409(代替HTTP 422)也可能有意义。


关于处理重复的注意事项:如果新实体的名称已经在数据库中,那么您认为新实体是重复的(如果我错了,请更正)。如果是这样,您可以考虑使用HTTP PUT而不是HTTP POST吗?

您可以定义以下资源:

HTTP PUT /record/:name

所以,"姓名"将成为URI的一部分。然后,如果有相同资源的第二个PUT(相同的"名称"),那么用409/422回复它会很优雅。

如果您使用不同的密钥进行唯一约束,请相应地修改URI。

根据经验,POST适用于您可以拥有给定资源的多个实例的情况,即

HTTP POST /log  ;; Because we have many logs

PUT用于每种资源都是唯一的情况:

HTTP PUT /person/:name (or /person/:tax-number if :name isn't unique)

另请注意,我已经从" putRecord"重新命名了您的资源。到"记录" - PUT是一种HTTP方法,没有理由在URI中使用它。