对比引用未知实体的POST的400对422响应
我试图找出正确的状态代码,以便在不同的场景下使用我正在处理的“类似休息”的API返回。
这个例子是从另一个关于正文中的语法类型问题的问题中借鉴的,但是我的问题假设了整个有效的语法。
假设我有一个端点允许以JSON格式进行POST'ing购买。 它看起来像这样:
{
"account_number": 45645511,
"upc": "00490000486",
"price": 1.00,
"tax": 0.08
}
在以下情况下适当的状态码是什么?
这些都是稳定的业务层面问题,可以防止“处理”发生,但是,一种情况涉及到GET中的某些内容会成为404。
请注意,帐号不在网址中,404也有误导性?
我们一次一个接一个。 这些代码中的每一个都是向您的客户端发出的信号,表明服务器运行正常,并且在请求成功执行之前必须对其进行更改。
由于格式错误,服务器无法理解请求。 客户端不应该在没有修改的情况下重复请求。
400通常指示语法错误; 作为用户,我应该在再次尝试之前查看请求的结构 。
服务器没有找到与Request-URI匹配的任何内容。 没有迹象表明病情是暂时的还是永久性的。 如果服务器通过某种内部可配置机制知道旧资源永久不可用并且没有转发地址,则应使用410(Gone)状态码。 当服务器不希望揭示请求被拒绝的原因时,或者没有其他响应适用时,通常使用此状态码。
404是Web服务器无法匹配任何网址路径时使用的标准代码。 作为客户端,我应该在再次尝试之前查看请求的URL 。
422(不可处理的实体)状态码意味着服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态码不合适),并且请求实体的语法是正确的(因此400(错误请求)状态码不合适),但无法处理包含的说明。 例如,如果XML请求体包含格式正确(即,语法正确),但语义错误的XML指令,则可能会出现此错误情况。
422通常用于内容违规。 作为用户,我应该在再次尝试之前查看我的请求的内容 。
现在在你的情况下,帐号是一个识别号码,但不包含在URL中。 404会告诉你的用户URL是错误的,而不是有效载荷。 换句话说,假设你的网址是:
http://www.myservice.net/endpoint
404会告诉我,在/端点没有服务存在,而不是没有帐号。 无论我提交什么内容,服务器都不会处理我的请求。 我应该做的修复将是在URL中查找错误,而不是数据有效载荷。 所以对我来说422会指向正确的方向,除非你开始在URL中包含帐号。
最终,这些都是设计偏好,只要确保将它们清楚地传达给用户即可。
如果您认为这些账户是资源状态的一部分(尽管是间接的),那么您可能会考虑409,因为该状态与请求的语义冲突。
但是,422通过Ruby on Rails和Dropwizard逐渐流行起来,它被用来指示身体的非语法问题。 这种增长趋势对于使用API的开发者来说是一个强烈的信号,他们需要排除语法并专注于主体。 开发人员时间通常是您的客户所承受的最大成本,因此通过引导开发人员的注意力,您可以让他们感到满意。
所以409是一个可能的答案,虽然相当新颖,422是更传统的方法,但显然RoR和DropWizard都相当新,所以这些约定可以说是变化很快!
在你的情况下,我认为422是足够的,但如果它与你的API的其他部分一致,则400并不坏。 当客户端出现问题时,使用400作为伞形错误代码是一种常见的约定,但是错误不适合特定的错误代码,或者您不想使用太多的错误代码。
如果POST有效负载有问题,404肯定是错误的。
链接地址: http://www.djcxy.com/p/45429.html上一篇: 400 vs 422 response to POST that references an unknown entity