我正在设计一个POST Restful API,我有一种情况,我必须根据请求正文中提供的元素之一授权用户。 例如。
{
division : "1",
name : "MyName",
address:{
no : 123,
street : "abc",
pincode : 222111
}
....
}
因此,发出POST请求的用户应该被授权在第1部分工作。我无法在没有获得请求主体的情况下授权用户。
还要验证我在DB中进行大量DB调用的一些属性,例如,检查上述地址是否有有效的pincode值。
所以我的问题是如何将错误代码返回给用户 -
基本上哪个错误代码继续进行另一个?
也可以这样做:
400 – request is bad, syntactically (division/pincode or other mandatory values not provided)
403 – authorize user
400 – request is bad, data specific validation (heavier operation, requiring to hit DB)
[编辑]我们建议不要使用422错误代码
答案 0 :(得分:2)
如有疑问,请查看RFC
400错误请求
由于格式错误,服务器无法理解该请求 句法。客户端不应该重复请求 修改
403 Forbidden
服务器理解请求,但拒绝履行请求。 授权无效,请求不应重复。如果 请求方法不是HEAD,服务器希望公开 为什么请求没有得到满足,它应该描述原因 因为该实体的拒绝。如果服务器不想做 此信息可供客户使用,状态代码404(不是 找到了)可以代替使用。
如果请求中没有提供除法 - 400或403?
我认为不适用。语法 - 尽管它缺少一些数据 - 不格式错误 由于上面引用的原因,403似乎也不正确:授权无法帮助等。
422 Unprocessable Entity(WebDAV; RFC 4918)
请求结构良好但由于无法遵循 语义错误。
这就是我在这种情况下经常使用的。
如果提供了分割,但用户未获得授权且密码无效 - 无效密码为400或403?
同样,我不认为400或403在这里做得很好。特别针对这种情况,401存在
401未经授权
类似于403 Forbidden,但专门用于身份验证时使用 是必需的,但已经失败或尚未提供。响应 必须包含一个包含挑战的WWW-Authenticate头字段 适用于所请求的资源。请参阅基本访问验证 和摘要访问身份验证。
答案 1 :(得分:0)
我认为你正走在正确的轨道上。假设每个请求都通过(http授权标头)进行身份验证
返回400,关于缺失的数据是可以的,此外,您可以添加错误响应正文,解释客户端请求未被接受的原因(在这种情况下是缺少的部门)。
返回403,如果发出请求的客户端未被授权与资源交互(在这种情况下是分部),则可以。
如果客户有权与资源进行交互,您必须先验证,因此必须先发送403,如果缺少必填字段,则可以将其视为400(有正确的解释)。 / p>
如果客户端未经过身份验证,则正确的响应应为401,但正如我之前所说,1)和2)在我的响应中假设客户端已针对服务器进行身份验证。
希望它有所帮助,
何塞路易斯