web-dev-qa-db-fra.com

Comment exclure certains services comme la connexion, inscrivez-vous de l'intercepteur Angular 5, HttpClient

je voulais exclure certains services utilisant l'intercepteur.

app.module.js

providers: [
    UserService,
    RolesService,
    {
        provide: HTTP_INTERCEPTORS,
        useClass: TokenInterceptor,
        multi: true
      },
],

Login.service.ts

return this.httpClient.post(this.appUrl + '/oauth/token', body.toString(), { headers, observe: 'response' })
.map((res: Response) => {
  const response = res.body;
  this.storeToken(response);
  return response;
})
.catch((error: any) => {
  ErrorLogService.logError(error);
  return Observable.throw(new Error(error.status));
  });
}
11
Haneep CR

Répondre à cela non seulement dans les commentaires demandés ;-)

Pour exclure certains services (ou même les mêmes services utilisés dans différents composants) d'un intercepteur, il est préférable de diviser votre application en modules et de fournir l'intercepteur uniquement dans les modules où cela est nécessaire. Par exemple, après vous être connecté ou à l'intérieur d'une zone d'administration.

L'intercepteur peut même être prévu pour des composants uniques en utilisant le @Component la propriété providers de la déclaration.

5
Fussel

Bien que la réponse de # Fussel (ci-dessus) fonctionne, il n'est souvent pas recommandé d'inclure le service d'intercepteur dans chaque module de composant. C'est contre-intuitif et contre-productif. Nous voulons l'intercepteur en un seul endroit et travaillons pour toutes les requêtes http. Une façon consiste à exclure la liaison d'en-tête dans la fonction intercept () en fonction de l'url.

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const re = /login/gi;
// Exclude interceptor for login request:
if (req.url.search(re) === -1 ) {
  req = req.clone({
    setHeaders: {
      Authorization: `Bearer ${localStorage.getItem('authToken')}`
    }
  });
}
return next.handle(req);

}

30
DragoRaptor

J'ai eu le même problème. Une fois implémenté, l'intercepteur chasse toutes les requêtes http de toute façon. C'était dans mon code pour savoir si j'avais ou non un jeton d'accès. Si je ne l'ai pas fait, le parametar du jeton d'intercepteurs doit être réglé sur "" (chaîne vide). Que tout se passe. Dans le code fn d'intercepteur, cela ressemble à ceci:

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

        //how to update the request Parameters
        **let token : string;
        let currentUser : any = JSON.parse(localStorage.getItem('currentUser'));
        if (currentUser){
            token = currentUser.access_token;
        }else{token = ""}**

        console.log("Token dobavljen sa localStorage.getItem:   ", token);
        if (token) {
            request = request.clone({ headers: request.headers.set('Authorization', 'Bearer ' + token) });
        }

        if (!request.headers.has('Content-Type')) {
            request = request.clone({ headers: request.headers.set('Content-Type', 'application/json') });
        }

        request = request.clone({ headers: request.headers.set('Accept', 'application/json') });

        //logging the updated Parameters to browser's console
        console.log("Before making api call : ", token);

        return next.handle(request).pipe(
            tap(
                event => {
                    //logging the http response to browser's console in case of a success
                    if (event instanceof HttpResponse) {
                    console.log("api call success :", event);
                    }
                },
                error => {
                    //logging the http response to browser's console in case of a failuer
                    if (event instanceof HttpResponse) {
                    console.log("api call error :", event);
                    }
                }
            )
        );
    //}
}
0
Dejan Jovancevic