没有必填字段的请求应该使用哪个适当的HTTP响应代码?

28

考虑一个简单的情况,用户要删除一个帖子。这是一个带有一个必填字段post_id的简单HTTP DELETE/POST请求。

如果post_id未被提供,服务器应该怎么做呢?

显然,用户不应该遇到这种行为,所以让我们保持严谨。

我的第一反应是返回400错误请求,但规范说:

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

我认为,从语法/ HTTP 视角来看,缺少字段是可以的,这是应用程序特定的语义需求。

给出解释的 200 OK 响应不好,500 错误感觉怪怪的,因为这是请求问题。

你有什么想法?


2个回答

52

400 是正确的响应码。

在 HTTP 的角度看,400 错误不仅限于语法错误。缺少必填参数是应用程序定义的语法错误,因此会返回“错误请求(Bad Request)”。

编辑

起初似乎没有单独的返回码有些奇怪,但是返回码的设计是为了区分客户端应该采取哪些操作。400 错误码意味着客户端应该根据应用程序定义的格式更改 POST 数据或查询字符串,因此对于这种情况是合适的。


这是一份RESTful响应代码列表,以及有关REST最佳实践的其他信息:http://goo.gl/Nf9gt - Will Curran

3
在REST场景中,要删除的资源应该通过URL进行标识,因此资源的ID应该是URL的一部分,以便正确地标识它。一旦这个假设是正确的,那么URL要么标识了一个不同的资源来进行删除,要么就没有(这会返回404)。
然而,在缺少参数的一般情况下,我经常使用403禁止错误。原因是请求已被理解,但我不会按照要求执行(因为有些东西是错误的)。响应实体解释了出了什么问题,所以如果响应是HTML页面,则错误消息在页面中。如果是JSON或XML响应,则错误信息在其中。
来自rfc2616

10.4.4 403 Forbidden

服务器理解了请求,但拒绝执行它。
授权也无济于事,不应重复该请求。
如果请求方法不是HEAD,并且服务器希望公开为什么没有满足请求,
它应该在实体中描述拒绝的原因。 如果服务器不希望将此信息提供给客户端,则可以
使用状态码404(未找到)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接