[英]Errorhandling between frontend and backend
在工作中,我们使用 java spring 后端和 vue 前端构建一个 web 应用程序。 目前我们使用 2 或 3 个 http 响应代码在前端和后端之间传递错误。 如果您使用错误的参数调用和端点,您将收到 BAD_REQUEST。 如果在后端抛出一些异常(与参数无关),后端返回一个 INTERNAL_SERVER_ERROR,如果你传递一些不在数据库中的 id,后端返回一个 NOT_FOUND。
这种方法有多个问题:
我已经找到了这个: https://www.baeldung.com/spring-response-status-exception我们可以使用消息字段传递有关错误的详细信息(消息字段中的特定错误 json)。 这是一个好主意吗?
意见?
吨
您当然可以在此字段中传回信息,但使用ResponseStatusException
s。 根据前端需要多少信息(例如,如果它只是向用户显示一条用户友好的消息),这可能足以满足您的需求。
如果您想在响应中使用自定义 object(尤其是每个异常/响应代码),另一种方法是使用@ControllerAdvice
并扩展ResponseEntityExceptionHandler
。
例如,假设您有一个自定义异常ExternalServiceUnavailableException
,它具有一些您可以从中检索的基础ServiceInformation
。 然后你可以做类似的事情
public class ServiceInformation {
private final String name;
private final String status;
private final String statusMessage;
//snip
}
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ ExternalServiceUnavailableException.class })
public ResponseEntity<Object> handleExternalServiceUnavailable(ExternalServiceUnavailableException ex, WebRequest request) {
final ServiceInformation si = ex.getServiceInformation();
return ResponseEntity
.status(503) // or whatever code you want
.body(si); // or map to some other object/format
// or use the constructor to supply headers etc.
}
}
当您抛出ExternalServiceUnavailableException
时,这将导致响应正文如下
{
"name": "my-external-service",
"status": "timeout",
"statusMessage": "Service timed out after 30 seconds"
}
可以在下面的文章中找到更完整的示例,其中相同的自定义错误 object 用于后果的每个异常以及默认处理程序。
https://www.baeldung.com/exception-handling-for-rest-with-spring
这使前端更容易解释(就像您提出的方法一样),因为只有一种格式可以预期和解析,但您可以自由地为每个异常返回不同的响应形状。
编辑:值得记住的是,还有响应代码 502(网关错误)和 504(网关超时)可用于指示外部服务不可用或超时。 如果这些是合适的,您可以只使用适当的ResponseStatusExceptions
和消息集以包含服务名称(或其他信息)。 如上所述,这取决于您需要/希望前台接收什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.