Angular: как перехватить запрос события, отправленный сервером?

#angular #server-sent-events #angular-http-interceptors

#angular #отправленные сервером события #angular-http-перехватчики

Вопрос:

Я написал перехватчик angular, чтобы добавить некоторые заголовки к моим запросам. Все в порядке, пока запрос SSE не будет перехвачен!

 @Injectable()
export class SessionUserDataInterceptor implements HttpInterceptor {

  constructor(@Inject(SESSION_USER_DATA) private userData: SessionUserData) {}


  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const setHeaders = {};

    if (this.userData.line) {
      setHeaders['Line'] = this.userData.line;
    }

    if (this.userData.profil) {
      setHeaders['Profil'] = this.userData.profil.id;
    }

    return next.handle(request.clone({setHeaders}));
  }
}
  

SessionUserData это просто оболочка для SessionStorage .

Я пытался добавить заголовки в свое соединение SSE, но это тоже не работает.

 const es = new EventSource(url, {headers: {Line: 'XXX', Profil: 'YYY'}} as any);
  

Любая помощь приветствуется.

Комментарии:

1. Cory указывает, что это для известных запросов клиента Angular. SSE не будет известен Angular. ultimatecourses.com/blog /.

Ответ №1:

HttpInterceptor Шаблон работает только для запроса, отправленного HttpClient . Это означает, что EventSource это не захвачено, и не является обычным XMLHttpRequest . Лучшее, что вы могли бы сделать, это перенести фактическое преобразование вашего запроса в вашем перехватчике в служебную функцию, которую вы можете вызвать внутри своего перехватчика и, возможно, в пользовательскую службу, которая оборачивает EventSource функциональность

Комментарии:

1. Просто любопытно, как утилита получит доступ к запросу на стороне сервера, разве браузер не предотвращает это?

2. У @JohnPeters EventSource действительно нет поддержки заголовков. Это можно преодолеть с помощью строки запроса, полизаполнения, которое ее поддерживает, или с помощью функциональности fetch потока

3. @JohnPeters кроме того, это событие, отправленное сервером, а не запрос рендеринга на стороне сервера 🙂 Я думаю, что именование немного сбило вас с толку

4. Извините, я оговорился, я имел в виду SSE

5. Спасибо за ваш ответ, но я не уверен, что понимаю, что вы имеете в виду, исходя из того, что вы имеете в виду… У вас есть исключения?