Могу ли я повторить вызов в ответ на HTTP-вызов с использованием перехватчика без использования catchError - PullRequest
0 голосов
/ 27 декабря 2018

In angular 6 Когда я вызываю службу http, используя перехватчик, если я получил ответ {"status": 403, "message": "Ошибка при получении данных, попробуйте снова"}

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

Следующий код при вызове метода success200, повторный вызов не работает. Он работает только в catchError

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
    const authService = this.injector.get(UserTokenService);

    return next.handle(this.addToken(req, authService.getToken())).pipe(
        tap(
            event => 
            {   
              if (event instanceof HttpResponse) {
                return this.success200(req, next,event.body);
              }
            },
            error => status = 'failed'
          ),

          catchError(error => {
     //This will work
    return next.handle(this.addToken(req,  authService.getToken()));
        })

        );
}






//All Success request comes here
success200(req: HttpRequest<any>, next: HttpHandler,response){
    const authService = this.injector.get(UserTokenService);
    const routerService = this.injector.get(Router);

    if(response.status=="403"){
      //this call not working

      return next.handle(this.addToken(req,authService.getToken()));
    }

    else{

        return;
    }

}

addToken(req: HttpRequest<any>, token: string): HttpRequest<any> {

    //req = req.clone({ headers: req.headers.set('Accept', 'application/json') });
    if(token != null) {
    //set token header with all request
        return req.clone({ setHeaders: { Authorization: token }});
    }
    else {
        return req;
    }

}

1 Ответ

0 голосов
/ 27 декабря 2018

Хой о Повторить Оператор.Например:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
  const authService = this.injector.get(UserTokenService);

  return next.handle(this.addToken(req, authService.getToken())).pipe(
    flatMap(
        event => 
        {   
          if (event instanceof HttpResponse) {
            return this.success200(req, next,event.body);
          }
          else {
            return throwError('Failed');
          }
        }
      ),
      retry(1)  // if you want to invoke 'next.handle' 1 additional time
  );
}

Я не тестировал этот код, но это общая идея, пример можно посмотреть в приведенной ниже ссылке.

IЯ создал этот пример стекаблика, чтобы вы могли увидеть retry в действии.

ОБНОВЛЕНИЕ:

Я провел дополнительное исследование и обнаружил, чтовсякий раз, когда при вызове http возникает ошибка 403 , вы автоматически вводите блок catch.Я создал еще один пример stackblitz , в котором вы можете увидеть, что происходит с http запросами ответов 200 и 403 .Что касается вашего примера, вы также можете попробовать что-то вроде этого:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
  const authService = this.injector.get(UserTokenService);

  return next.handle(this.addToken(req, authService.getToken())).pipe(
    flatMap(
        event => 
        {
           if (event instanceof HttpResponse) {
              return this.success200(req, next,event.body);
           }
        }
      ),
      catchError(e => {
        console.log('Failed attempt to login');
        return throwError('Failed');  // retry logic should automatically kick in whenever _throwError_ occurs
      }),
      retry(1)  // if you want 1 additional time
  );
}
...