RESTful服务,如果验证失败应该如何响应?

21

我有一个服务,需要接收一个实体并保存/更新该实体:

http://myhost.com/rest/entity

我使用POST方法并提交JSON数据。在服务端检测到传递的实体不好,比如无效的订单或者指定了不存在的客户。

我应该如何回复?使用HttpCode.NotFound还是其他的?你对这种情况要如何回复呢?


1
那真的取决于你自己来决定,这是你的服务。 - jgroenen
可能是重复的问题:REST HTTP状态码用于验证失败或无效的重复 - MaxiWheat
3个回答

35

422不可处理的实体,由WebDAV(RFC 4918)定义:

422(不可处理的实体)状态码表示服务器理解请求实体的内容类型(因此,415(不支持的媒体类型)状态码不合适),并且请求实体的语法正确(因此,400(错误请求)状态码不合适),但无法处理包含的指令。例如,如果XML请求正文包含格式正确(即语法正确),但语义上错误的XML指令,则可能会发生此错误条件。


4
我很喜欢这个。这可能不会得到纯粹主义者的认可,但它比使用同样的状态作为格式错误的请求要好得多。 - thomas-peter
在我正在工作的项目中,客户无法仅通过状态码(而不检查响应正文)区分验证错误和格式错误的请求,这也让我非常困扰。因此,我独立地想到使用422来区分前者。在进行一些合理性检查搜索以确保没有更好的替代方案时,我遇到了这个问题,所以很高兴看到其他人也使用了这种方法,而且这并不完全是离谱的。我可以假设你们两个都没有遇到这种方法的其他下游问题吗? - rscarter
这就是我所做的事情,因为常用的400并不在技术上正确,因为请求并没有出现问题。 - Emmanuel

26
在我们的项目中,针对这种情况,我们会进行以下操作:
  1. 将响应码设置为HTTP 400 Bad Request。
  2. 将响应主体设置为以下JSON:{"message":"%此处添加详细错误信息%"}
但这真的很主观。
另外,我建议阅读这篇关于RESTful错误处理的博客文章——它描述了许多可用的选项,因此您可以选择适合自己的方式。

1
这就是我们的工作。如果可用,我们会返回请求的相同媒体类型。在网络世界中,如果没有可用的资源,你会得到一个带有text\html文本的400错误。在这个例子中,媒体类型是application\json。 - suing
谢谢!我在考虑除了状态码之外,在头部传递一些信息,但是在参考了你提到的文章和这篇帖子之后,我决定为我的服务选择一个通用响应对象,并且只使用400和200代码(除了401用于身份验证)。 - katit
如果您要返回验证错误,则400足够了。 - jim smith
链接已存档在https://web.archive.org/web/20180311152736/http://www.onlamp.com/pub/wlg/4009 - undefined

0

我认为你应该选择一个客户端错误代码400错误请求403禁止可能是个好的起点。


5
在那种情况下,"418" 显然是最佳选择。 - Spencer Kormos
2
403对于所描述的情景不适用。 - Darrel Miller
2
为什么403不合适?https://dev59.com/3HA75IYBdhLWcg3wdIp0#3290369 看起来对于400和403有不同的看法。 - Aaron Gibralter

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