В предыдущей статье, используя Api proxy в Angular, мы рассмотрели проблему локального совместного интерфейса отладки и использовали прокси.
Наши интерфейсы пишутся и обрабатываются отдельно. В реальных проектах разработки существует множество интерфейсов, некоторые из которых требуют учетных данных для входа, а некоторые — нет. Если каждый интерфейс не обрабатывается должным образом, можем ли мы рассмотреть возможность перехвата и инкапсуляции запроса? [Рекомендуемые соответствующие учебные пособия: «Учебное пособие по Angular»]
Эта статья будет реализована.
Чтобы различать среды
, нам нужно перехватывать сервисы в разных средах. При использовании angular-cli
для создания проекта он автоматически различает среды в каталоге app/enviroments
:
Environments. ├── Environment.prod.ts // Конфигурация, используемая в производственной среде └── Environment.ts // Конфигурация, используемая в среде разработки.
Давайте изменим среду разработки:
// enviroment.ts экспортировать константную среду = { базовый URL: '', производство: ложь };
baseUrl
— это поле, добавляемое перед запросом, когда вы его делаете. Оно указывает на адрес, который вы хотите запросить. Я ничего не добавлял. Фактически, это было эквивалентно добавлению содержимого http://localhost:4200
.
Конечно, контент, который вы добавляете сюда, должен быть скорректирован в соответствии с контентом, добавленным на ваш прокси-сервер. Читатели могут подумать и проверить самостоятельно.
Мы создаем службу перехватчика http-interceptor.service.ts
. Мы надеемся, что каждый из них сможет это сделать
.
запрос будет проходить через эту службу.
// http-interceptor.service.ts import {Injectable} из '@angular/core'; импортировать { HttpEvent, Хттпхандлер, HttpInterceptor, // Перехватчик HttpRequest, // Запрос} от '@angular/common/http'; импортировать { Observable } из 'rxjs'; импортировать {tap} из 'rxjs/operators'; импортировать {среду} из 'src/environments/environment'; @Инъекционный({ предоставлено: 'корень' }) класс экспорта HttpInterceptorService реализует HttpInterceptor { конструктор() { } intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { пусть secureReq: HttpRequest<any> = req; secureReq = secureReq.clone({ URL-адрес: Environment.baseUrl + req.url }); вернуть next.handle(secureReq).pipe( кран( (ответ: любой) => { // Обрабатываем данные ответа console.log(response) }, (ошибка: любая) => { // Обработка данных об ошибках console.log(error) } ) ) } }
Чтобы перехватчик вступил в силу, мы должны внедрить его в app.module.ts
:
// app.module.ts импортировать { HttpClientModule, HTTP_INTERCEPTORS } из '@angular/common/http'; //Импорт службы перехватчика { HttpInterceptorService } из './services/http-interceptor.service'; провайдеры: [ // Внедрение зависимостей { предоставить: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, мульти: правда, } ],
Проверка
: на этом этапе мы успешно внедрили перехватчик. Если вы запустите npm run dev
, вы увидите в консоли следующее сообщение:
Чтобы проверить, требуются ли учетные данные контента для доступа к контенту, я использовал интерфейс [post] https://jimmyarea.com/api/private/leave/message
чтобы попытаться получить следующую ошибку:
Серверная часть уже обработала, что для работы этого интерфейса требуются учетные данные, поэтому напрямую сообщается об ошибке 401
.
Итак, вот в чем проблема. Как нам нужно ввести наши учетные данные после входа в систему?
Изменяем содержимое перехватчика следующим образом:
let secureReq: HttpRequest<any> = req; // ... // Используем localhost для хранения учетных данных пользователя в заголовке запроса if (window.localStorage.getItem('ut')) { let token = window.localStorage.getItem('ut') || secureReq = secureReq.clone({ заголовки: req.headers.set('токен', токен) }); } // ...
Срок действия этого сертификата требует, чтобы читатели оценили, действителен ли срок действия при входе в систему, а затем рассмотрели возможность сброса значения localstorage
, иначе всегда будут сообщаться об ошибках. Это тоже очень просто. инкапсуляция localstorage
удобна для работы. Да~
[Конец]