Вот что я реализовал на данный момент:
Бэкэнд (WebFlux):
Контроллер WebFlux отправляет SSE с использованием MediaType.TEXT_EVENT_STREAM_VALUE:
Код: Выделить всё
@RestController
public class EventController {
@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux getEvents() {
return Flux.interval(Duration.ofSeconds(1))
.map(tick -> "Event #" + tick)
.doOnNext(event -> System.out.println("Sending: " + event));
}
}
Фронтенд (Angular):
Я использую собственный API EventSource для использования SSE:
Код: Выделить всё
fetchEvents(): Observable {
return new Observable(observer => {
const eventSource = new EventSource('/api/events'); // Proxying through Angular dev server
eventSource.onmessage = event => {
observer.next(event.data);
};
eventSource.onerror = error => {
console.error('EventSource error:', error);
observer.error(error);
eventSource.close();
};
return () => eventSource.close();
});
}
Код: Выделить всё
this.fetchEvents().subscribe({
next: event => console.log('Received event:', event),
error: error => console.error('Error:', error),
});
В разработке я использую конфигурацию прокси для перенаправления /api/events на http://localhost:8080/events:proxy.conf.json:
Код: Выделить всё
{
"/api/*": {
"target": "http://localhost:8080",
"secure": false,
"changeOrigin": true
}
}
1. В приложении Angular EventSource немедленно запускает событие onerror без получения данных.
2.На вкладке «Сеть» браузера показано, что запрос к /api/events выполнен, но соединение немедленно закрывается без каких-либо данных SSE.
3.Ошибок в сети нет. серверные журналы.
Что я пробовал:
1. Тестирование конечной точки /events с помощью Curl и Postman — работает отлично.
2. Убедитесь, что заголовок ответа включает Content-Type: text/event-stream.
3. Двойная проверка конфигурации прокси-сервера в Angular.
4. Добавление настроек CORS в бэкэнд WebFlux:
Ява
Код: Выделить всё
@Bean
public CorsWebFilter corsWebFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("http://localhost:4200");
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
Любая помощь будем очень признательны!
Подробнее здесь: https://stackoverflow.com/questions/793 ... bflux-back