2017-08-09 1 views
2

Dans notre projet Angular 4.3, nous avons des composants de site public et des composants de site sécurisé (connectés) séparément. Nous utilisons @angular/common/http. Nous voulons implémenter différents intercepteurs http pour les composants public-site et les composants secured-site. Par exemple,Comment utiliser deux instances de HttpClient (une avec 2 intercepteurs et l'autre avec 1 intercepteur) dans Angular 4.3?

  1. composants publics site - d'appliquer seulement au-dessous intercepteur
    LoggingInterceptor
  2. composants sécurisé site - à appliquer en dessous de deux intercepteurs
    LoggingInterceptor
    AuthTokenInterceptor (pour passer le jeton d'authentification en-tête de requête)

Nous avons essayé d'ajouter les détails des fournisseurs HTTP_INTERCEPTORS à chaque niveau de composant @Component avec différents intercepteurs. Mais la demande ne va pas dans l'un des intercepteurs.

La demande est en cours d'interception uniquement si nous ajoutons les détails du fournisseur HTTP_INTERCEPTORS dans @NgModule. Ici, le problème est, les demandes http du site public vont également dans AuthTokenInterceptor qui n'est pas nécessaire.

Alors, comment devrions-nous résoudre ce problème? Merci.

Répondre

1

Vous n'avez pas besoin de deux instances de HttpClient lorsque les intercepteurs sont appliqués à chaque fois sur chaque requête http. Je ne sais pas comment vous gérez l'état de notre application, sur la base de ce que vous pouvez juste mettre une condition dans votre intercepteur qui décidera si la demande actuelle mute ou pas. De cette façon, si la demande est déclenchée par public-site components, une en-tête Authorization ne sera pas attachée. par exemple:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    if ('your condition here if public-site components') { 
     // Just return original request 
     return next.handle(req); 
    } else { 
     // Here return modified one 
     // Get the auth header from the service. 
     const authHeader = this.auth.getAuthorizationHeader(); 
     // Clone the request to add the new header. 
     const authReq = req.clone({headers: req.headers.set('Authorization', authHeader)}); 
     // Pass on the cloned request instead of the original request. 
     return next.handle(authReq); 
    } 

    } 

Si vous ne voulez pas envoyer en-tête Authorization-api/url particulier il suffit d'utiliser req.url pour définir un filtre sur ce point.

+0

Merci @Kuncevic. Nous trouverons la condition pour différencier les requêtes de composants du site public. Mais posez une question, si nous ajoutons le fournisseur HTTP_INTERCEPTORS à un niveau @ Component (retiré de @ NgModule) et si nous faisons des appels http dans la méthode ngOnInit de ce composant, l'intercepteur ne sera pas appelé. Si nous déplaçons les mêmes lignes de code (fournisseur) vers @ NgModule, les intercepteurs fonctionnent. Le fournisseur HTTP_INTERCEPTORS doit-il être configuré uniquement dans NgModule? – Samy

+0

Voilà comment fonctionne l'injection de dépendances. Même si vous mettez vos 'public-site' et' secured-site' à séparer les 'modules', chacun de ces évidemment vous devrez déclarer dans' app.module' et ensuite dire dans 'public-site.module' vous spécifiez 'interceptor1' et dans' secure-site.module' vous spécifiez 'interceptor1' et' interceptor2' de sorte que vous finirez par 'deux appels' interceptor1'. Cependant, si vous faites que chacun de vos modules soit plus lent que vous ne le feriez, car chaque module de chargement paresseux a son propre arbre d'injection, les fournisseurs ne vont pas interférer dans ce cas. – Kuncevic

+0

mais je ne vous recommande pas de résoudre votre problème en utilisant des modules de chargement paresseux comme «chargement paresseux» servant un but différent. Je ne recommanderai pas d'utiliser le «chargement paresseux» juste pour avoir un ensemble différent de 'fournisseurs d'interception '/' provider' pour chacun de vos modules 'lazy laded', j'espère que c'est clair. – Kuncevic