Angular: HttpInterceptor с другой обработкой для конкретной c ситуации - PullRequest
0 голосов
/ 27 февраля 2020

Я знаю, что в Angular есть HTTPInterceptor:

@Injectable()
export class HTTPRequestInterceptor implements HttpInterceptor {

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      tap(
        (_response: HttpEvent<any>) => {
          // nothing to do ... ... used for sending anyway...
        },
        (error: HttpErrorResponse) => {
         ... // display message
        }

Насколько я понимаю, это применимо ко всем моим запросам. Теперь у меня есть ситуация, что для одного указанного c запроса я не хочу применять обычную обработку ошибок. Есть ли простой способ добиться этого? например, установив некоторые специальные параметры в моем запросе

this.http.get<MyInfo>(`getlastInfo/${id}`).toPromise();

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Простой, но грязный способ

@Injectable()
export class HTTPRequestInterceptor implements HttpInterceptor {

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
 if(req.url.contains('getlastInfo')){
 //specific handling
 } else {
  //normal handling
 }

}

Вы также можете выполнить проверку с помощью req.body или req.headers, установив, например, указанное значение ключа c в заголовке.

1 голос
/ 27 февраля 2020

Как предположил BELLIL, читать заголовок проще, чем полагаться на URL. Вы все еще можете удалить заголовок перед отправкой на сервер:

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

    const doSpecificHandling = req.headers.has('Angular-Error-Handler');

    return next.handle(req.clone({
      headers: req.headers.delete('Angular-Error-Handler')
    })).pipe(
      tap(
        (_response: HttpEvent<any>) => {
          // nothing to do ... ... used for sending anyway...
        },
        (error: HttpErrorResponse) => {
          if (doSpecificHandling) {
            //handle error for specific case
          } else {
            //handle error for generic case
          }
        }
      )
    );
  }

С запросом:

this.http.get<MyInfo>(`getlastInfo/${id}`, {
  headers: new HttpHeaders().set('Angular-Error-Handler', 'diff'),
}).toPromise();
0 голосов
/ 27 февраля 2020

Это, вероятно, более простой способ сделать это, но одним из способов может быть проверка URL-адреса в перехватчике и условное выполнение логики c в перехватчике.

@Injectable()
export class HTTPRequestInterceptor implements HttpInterceptor {

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      tap(
        (_response: HttpEvent<any>) => {
          // nothing to do ... ... used for sending anyway...
        },
        (error: HttpErrorResponse) => {
            if(req.url === "some_url"){
                //handle error for specific case
            }else{
                //handle error for generic case
            }
        }
      )
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...