繁体   English   中英

前端和后端之间的错误处理

[英]Errorhandling between frontend and backend

在工作中,我们使用 java spring 后端和 vue 前端构建一个 web 应用程序。 目前我们使用 2 或 3 个 http 响应代码在前端和后端之间传递错误。 如果您使用错误的参数调用和端点,您将收到 BAD_REQUEST。 如果在后端抛出一些异常(与参数无关),后端返回一个 INTERNAL_SERVER_ERROR,如果你传递一些不在数据库中的 id,后端返回一个 NOT_FOUND。

这种方法有多个问题:

  • 我们没有错误情况下的结构可以用来将信息传递给用户(前端)
  • 我们想向用户指出问题,这些问题不能通过 HTTP 响应代码进行分类。 例如,如果外部服务不可用,我们希望将服务名称传递给前端。 但我不知道“SERVICE_UNAVAILABLE”是否适合这里......

我已经找到了这个: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM