Angular 9 HttpClient: игнорировать заголовок при одном вызове - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь сделать запросы к API Google Books с помощью HttpClient в Angular 9. Я хочу отключить заголовок авторизации в одном запросе на получение .

Моя проблема в том, что я уже вошел в систему, и мои запросы имеют заголовок авторизации, который вызывает обращения к API книг Google для возврата ошибки 401. Я могу повторить то же самое в почтальоне. Добавление параметра ключа к вызову запроса (где я передаю свой ключ API) не имеет значения.

При отключенном заголовке авторизации я получаю код состояния 200:

enter image description here

При включенном заголовке авторизации я получаю код состояния 401:

enter image description here

И, наконец, мой запрос в браузере:

enter image description here

Здесь я добавляю свой заголовок авторизации в httpClient:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const currentUser = this.localStorageService.getCurrentUser();
    if (currentUser) {
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${currentUser.split('"')[3]}`
        }
      });
    }
    return next.handle(request);
  }

И, наконец, конструктор, в который я вставляю httpClient и вызов:

  constructor(public httpClient: HttpClient) {
  }

  public requestBook(isbn: string): Observable<any> {
    return this.httpClient.get(`https://www.googleapis.com/books/v1/volumes?q=${isbn}`);
  }

Мой вопрос: я хочу отключить заголовок авторизации в запросе get в requestBook, но оставить его где-нибудь еще. Я думал, что создам новый экземпляр httpClient, но в нем также есть заголовок авторизации.

1 Ответ

1 голос
/ 02 мая 2020

Я против использования перехватчика для манипулирования HTTP-запросом в Angular проекте, если только он не является абсолютно необходимым и не будет изменен для разных запросов ресурсов или конечных точек.

В вашем случае это явно не так потому что вы хотите, чтобы заголовок авторизации был удален в одном конкретном c запросе.

Конечно, вы можете сделать несколько глупых настроек, чтобы быстро заставить его работать, например

if (currentUser && !request.url.includes('www.googleapis.com/books/v1/volumes')) {
  request = request.clone({
    setHeaders: {
      Authorization: `Bearer ${currentUser.split('"')[3]}`
    }
  });
}

Но я бы хотел Рекомендую создать собственную службу angular вместо манипулирования глобальными запросами с помощью перехватчика.

Таким образом, вместо вызова this.httpClient.get(), теперь вы вызываете this.myApiService.get() вместо этого, просто оборачивая службу HttpClient некоторыми дополнительными business logi c в соответствии с вашими потребностями.

Затем, когда вы хотите отключить отправку заголовка авторизации, укажите этот флаг в своем собственном методе и используйте его примерно так:

this.myApiService.get('my-resource', { noAuth: true });

This более удобен в сравнении с перехватчиком Blackbox, который иногда сводит ваших коллег с ума.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...