3 回答
TA贡献2039条经验 获得超7个赞
你走在正确的轨道上。在我看来,4xx为所有未经检查的异常返回响应代码并不总是正确的。我宁愿将这些异常的定义子集映射到4xx响应代码,其他任何内容都应该是内部服务器错误,因此是500响应代码。
@ResponseStatus(value=HttpStatus.NOT_FOUND)
public class EntityNotFoundException extends RuntimeException {
// ...
}
@Service
如果未找到实体,则可以从带注释的类抛出此异常。对于其他情况,您也可以定义自定义异常。你也可以坚持你@ExceptionHandler
,但是你必须自己做映射。
我应该是将异常映射到相关 HTTP 响应代码的好习惯:
错误的请求:
400
未找到:
404
禁止:
403
内部服务器错误:
500
此外,如果您的请求成功,请不要忘记返回以下(或任何其他)响应代码之一。
好的:
200
创建:
201
以上响应代码是常用的。当然,还有更多,但大多数 API 只需要一小部分。通过正确的映射,客户端可以更轻松地了解可能出错(或正确)的内容,然后可以执行进一步的操作或显示客户端所需的信息。例如:
200
: 显示成功信息403
: 重定向到登录页面400
: 如果提交了表单,则显示错误
如果出现任何问题,在正文中包含有意义的信息也是一种很好的做法。这也回答了以下问题:“如果我无法将异常映射到现有响应代码,我该怎么办?”。我问过自己同样的问题,答案很简单。尝试将其映射到最接近的响应代码并在正文中包含其他任何内容。
如果客户端缺少参数,您可以使用以下方法:
{ "error" : "Bad Request - Your request is missing parameter 'id'. Please verify and resubmit." }
或者对于上述表单错误(响应代码400
):
{ "errors": [ "username": "AlreadyInUse", ]}
在返回正文中的信息时,请确保坚持使用一种格式。否则,工作起来很痛苦。
TA贡献1818条经验 获得超8个赞
恕我直言,它不依赖于运行时与检查异常模式,而是依赖于语义正确的区分。
默认情况下,异常类型不反映此语义。
5xx 是在告诉客户您那边出了点问题。
4xx 告诉客户端 API 使用“错误”或未按预期方式使用。
您可以使用运行时或检查异常来实现 4xx 或 5xx 状态代码。这仅取决于您自己的软件架构。
我不会从检查或运行时异常的区别中确定 4xx/5xx(似乎损害了最小惊讶原则 - POLA)
添加回答
举报