将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端

Posted

技术标签:

【中文标题】将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端【英文标题】:Passing error messages from SSE (Webflux) Spring Boot app to Angular 7 frontend 【发布时间】:2019-08-10 02:55:02 【问题描述】:

我的应用程序是一个带有多个端点的 Spring Boot 应用程序。我们正在尝试使用 Webflux 添加启用 SSE 的端点。

用例:

第 1 步:前端向 POST 端点提交请求并获取唯一 ID。

第 2 步:前端使用 GET 端点获取处理后的结果(启用 SSE - Flux)

Angular 使用 EventSource 对象来使用 SSE 端点。它需要端点来生成文本/事件流。它适用于积极的测试用例。但是当服务抛出运行时异常时,Angular 前端无法获取 HTTP 状态代码和异常详细信息。它只是没有数据的错误。

抛出的异常:

@ResponseStatus(code = HttpStatus.NOT_FOUND)
public class RequestNotFoundException extends RuntimeException 

    private static final long serialVersionUID = 1L;

    public RequestNotFoundException(String message) 
        super(message);
    

如this 中所述,返回Flux<ServerSentEvent> 并使用自定义事件终止通量:

Java 端点

 @GetMapping(path= "id/async", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<Optional<ProcessedResult>>> getProcessedResultStream(
        @PathVariable("id") @ApiParam(value = "The unique identifier of the request", required = true) String id)
        throws InterruptedException 
    // Combining data and adding a disconnect event to handle at the frontend.
    return Flux.concat(
            Flux.just(ServerSentEvent.<Optional<ProcessedResult>>builder(service.getProcessedResult(id))
                    .build()),
            Flux.just(ServerSentEvent.<Optional<ProcessedResult>>builder().event("disconnect").build()));

这有助于通过断开连接来关闭 UI 端的连接。但我的主要问题仍然悬而未决。我应该如何将错误消息传播回前端?所有其他(正常)端点使用上面给出的正确 HTTP 代码抛出自定义运行时异常。

我是否应该更改我的 ProcessedResult 类以获取异常详细信息?

【问题讨论】:

【参考方案1】:

服务器端事件使用开放的 HTTP 连接从服务器流式传输内容。根据 W3C 规范 Eventsource HTTP 200 OK 响应需要一个正确的 Content-Type 标头来建立连接,HTTP 500, 502, 503, 504 或任何其他网络错误将导致浏览器重新建立连接。如果上述情况均不满足,则使用readyState = 'CLOSED' 触发错误事件。简而言之,onError 回调仅用于处理网络超时或访问控制问题。

无法根据运行时异常发送不同的 HTTP 状态代码,因为您在建立连接时已经发送了 200 Ok。处理运行时错误的唯一方法是捕获异常并从服务器和close 发送自定义命名事件EvetSource 基于此。

【讨论】:

以上是关于将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端的主要内容,如果未能解决你的问题,请参考以下文章

WebFlux系列 Server-Sent Events

Spring Reactive WebFlux - 如何自定义 BadRequest 错误消息

Spring Boot WebFlux 不工作请求控制器

后端消息推送-SSE协议

将文件从 AWS s3 (SSE) 存储桶复制到谷歌云

谈谈webflux那些事