Как исключить некоторые службы, такие как вход, регистрация в перехватчике Angular 5, HttpClient

Я хотел исключить некоторые сервисы, использующие перехватчик.

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));
  });
}

person Haneep CR    schedule 10.04.2018    source источник
comment
вам нужно ввести эту услугу, в чем проблема?   -  person Pranay Rana    schedule 10.04.2018
comment
Предоставляйте перехватчик только в тех модулях, где он вам нужен, тогда HTTP-запросы других модулей исключаются из перехватчика. Может быть даже возможно для каждого компонента, поскольку каждый компонент имеет свой собственный инжектор (поставщики).   -  person Fussel    schedule 10.04.2018
comment
@Fussel ответит на это   -  person    schedule 10.04.2018
comment
Спасибо @Fussel, решит проблему   -  person Haneep CR    schedule 10.04.2018


Ответы (6)


Чтобы дать на это ответ не только в комментариях, как просили ;-)

Чтобы исключить некоторые службы (или даже те же самые службы, используемые в разных компонентах) из перехватчика, лучше всего разделить ваше приложение на модули и предоставить перехватчик только в тех модулях, где это необходимо. Например, после входа в систему или в админке.

Перехватчик может быть даже предоставлен для отдельных компонентов с использованием свойства providers объявления @Component.

person Fussel    schedule 10.04.2018
comment
Привет, Фюссел, можешь ли ты привести пример, как это сделать? Я попытался импортировать перехватчик в конкретный модуль, но все еще кажется, что он распространяется на весь сайт. Ваша рекомендация интересна. - person L1ghtk3ira; 15.03.2019
comment
Это сработает, но это не самый разумный подход к проблеме: если у вас большое приложение, вам придется реорганизовать все модули в вашем приложении, а это займет много времени. Пожалуйста, рассмотрите ответ @ DragoRaptor ниже. Это обеспечивает подход, который не требует касаться всех модулей в вашем приложении. - person Andrea Gherardi; 16.07.2019
comment
@AndreaGherardi, хотя я согласен с некоторыми пунктами нижеприведенного awnser, рассмотрите возможность наличия нескольких модулей, которые не требуются для присоединения токена / или другого перехватчика, вы действительно хотите исключить все это с помощью регулярного выражения? На мой взгляд, это было бы менее интуитивно понятным и более подверженным ошибкам. Если у вас много модулей, как вы говорите, вы можете подумать о перемещении их в один родительский модуль и, например, добавить туда перехватчик. Для большинства приложений подойдет awnser, приведенный ниже, но особенно для больших приложений ... ну, как я уже сказал. - person Fussel; 17.07.2019
comment
Обычно мы ищем глобальный и уникальный способ обработки всех наших запросов, и мы действительно не хотим разделять наш контроль по модулям. - person Enrique Ortuño; 13.09.2019
comment
Второй L1ghtk3ira. У меня это не работает. Мой перехватчик находится только в одном из моих подмодулей и применяется ко всем HTTP-запросам. - person user3658800; 25.02.2020
comment
@ user3658800 Лучше откройте новый вопрос, используя то, что вы пробовали, у меня нет кода, использующего этот банкомат. - person Fussel; 26.02.2020
comment
@Fussel уже сделал, ответов пока нет: stackoverflow.com/q/60386852/3658800 - person user3658800; 26.02.2020

Хотя ответ # Fussel (выше) работает, часто не рекомендуется включать службу перехватчика в каждый компонентный модуль. Это противоречит интуиции и непродуктивно. Мы хотим, чтобы перехватчик был в одном месте и работал со всеми http-запросами. Один из способов - исключить привязку заголовка в функции intercept () на основе 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);

}

person DragoRaptor    schedule 07.06.2018
comment
Итак, re variable, который является /login/gi; URL-адресом, проигнорирует токен заголовков и выполнит запрос, верно? - person KnowledgeSeeker; 29.08.2018
comment
Я не согласен. Я считаю ответ Фюсселя более правильным и не лишенным интуиции, поскольку ваш ответ создает скрытую зависимость перехватчика от конечных точек. Что, если я создам новую конечную точку, которую хочу исключить из области действия перехватчика http? Мне нужно не забыть обновить HttpInterceptor. - person Jacopo Lanzoni; 03.07.2019

Я должен был решить то же самое. Деление на модули для меня очень дорогое удовольствие. И решение #DragoRaptor не подходит, когда у вас есть несколько точек, где нужно "перепрыгнуть" перехватчик.

Мое решение неортодоксальное, но, возможно, оно пригодится кому-то другому.

Он просто состоит из:

  1. Включите в запрос еще один параметр
  2. Проверить этот параметр в перехватчике
  3. Удалить параметр

Пример вызова

    public searchPersons(term: string): Observable<any> {
       return this.http.get('person/', { params: { dni: term, spinner: 'no' } });
    }

Пример перехватчика

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

// check if you have the parameter 'spinner'
    const spinner = request.params.get('spinner');
    if (spinner && spinner === 'no') {

// remove parameter
      request.params.delete('spinner');

// jump the interceptor
      return next.handle(request);
    }

// Execute interceptor

  }
}

person Manuel Ortiz    schedule 27.01.2020

Вы можете использовать для этого HttpBackend. Пример приведен ниже

import { Injectable } from '@angular/core';
import { HttpClient, HttpBackend } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class NoheaderService {

 private httpClient: HttpClient;
  constructor( handler: HttpBackend) { 
     this.httpClient = new HttpClient(handler);
     }

   fetchInsta(username) {
      return new Promise((resolve, reject) => {
         this.httpClient.get(`https://www.instagram.com/${username}/?__a=1`)
          .subscribe((response: any) => {
           resolve(response);
             },reject);
               })
              }
          }
person Pran R.V    schedule 21.02.2020

У меня была такая же проблема, я смог решить ее вот так:

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

// You can retrieve the url or a part in order to filter them
       if (request.url.slice(0, 20) != 'https://site.to.exclude') {
      request = request.clone({
          setHeaders: {
             'content-type': 'application/json',
            // or your header specific add to the interceptor
          }
        });
      }
     else {
//  interceptor does not add specific header
      return next.handle(request)
      }
   }
person Fisherman    schedule 05.03.2021

У меня была аналогичная проблема. После внедрения перехватчика все HTTP-запросы все равно будут отслеживаться. В моем коде говорилось о том, есть ли у меня токен доступа или нет. Если нет, то параметр токена перехватчиков должен быть установлен в "" (пустая строка). Чем все идет. В коде fn перехватчика это выглядит так:

       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);
                    }
                }
            )
        );
    //}
}
person Dejan Jovancevic    schedule 23.03.2019