所以,我试图显示有意义且准确的HTTP状态代码,即使在线完成示例后我也感到困惑。这是我的情况:
在接受查询参数的URL中:
@POST query
Sample URL: /putRecord?Name=A&Age=25&house=permanent
因此,如果已有重复条目,我无法添加记录。我是否显示304(未修改)或仅显示2的错误代码? 澄清:对于3,另一种可能性是当我无法实际承诺DB和我回滚(可能)。现在的状态代码是什么?
非常感谢!
答案 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中使用它。