Обновленный HttpClient¶
Без сомнения, HttpClient — один из самых известных сервисов, входящих в состав Angular. В 15-й версии команда Angular адаптировала его для новых автономных компонентов. В связи с этим была пересмотрена и концепция перехватчиков.
В этой главе я расскажу об этих нововведениях.
Исходный код
Автономные API для HttpClient¶
Начиная с версии 15, HttpClient можно настроить без обращения к модулю HttpClientModule. Вместо этого мы можем использовать provideHttpClient при загрузке нашего приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Эта новая функция также позволяет использовать дополнительные возможности HttpClient. У каждой функции есть своя функция. Например, функция withInterceptors включает поддержку Http-перехватчиков.
Комбинация функции provideXYZ и нескольких необязательных функций withXYZ выбрана не случайно, а соответствует шаблону, который команда Angular обычно предлагает для автономных API. Поэтому разработчики приложений при создании новой библиотеки должны быть начеку и искать функции, начинающиеся с provide или with.
Кроме того, этот паттерн приводит к очень приятному побочному эффекту: библиотеки становятся более древовидными. Это происходит потому, что при статическом анализе исходного кода очень легко выяснить, вызывает ли приложение ту или иную функцию. В случае с методами это не так просто из-за возможности полиморфного использования базовых объектов.
Функциональные перехватчики¶
При внедрении автономных API команда Angular также воспользовалась возможностью и немного пересмотрела HttpClient. Одним из результатов этого стали новые функциональные перехватчики. Они позволяют выражать перехватчики в виде простых функций. Отдельная служба, реализующая предопределенный интерфейс, больше не нужна:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Показанный перехватчик добавляет пример маркера безопасности к HTTP-вызовам, направленным на определенные URL-адреса. За исключением того, что перехватчик теперь является функцией типа HttpInterceptorFn, базовая функциональность этой концепции не изменилась. Как показано выше, функциональные перехватчики могут быть настроены с помощью withInterceptors при вызове provideHttpClient.
Перехватчики и ленивая загрузка¶
Перехватчики в ленивых модулях всегда приводили к путанице: Как только ленивый модуль вводит свои собственные перехватчики, перехватчики внешних областей видимости — например, корневой области видимости — больше не срабатывают.
Даже если модули с отдельными компонентами и API уходят в прошлое, основная проблема остается, тем более что конфигурации (ленивых) маршрутов теперь могут создавать свои собственные службы:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Эти сервисы соответствуют тем, которые приложение ранее зарегистрировало в ленивых модулях. Технически, Angular вводит свой собственный инжектор, когда доступен массив providers. Этот так называемый инжектор окружения определяет область видимости для текущего маршрута и его дочерних маршрутов.
Новая функция provideHttpClient также может быть использована в этом массиве providers для регистрации перехватчиков для соответствующей ленивой части приложения. По умолчанию применяется ранее рассмотренное правило: Если в инжекторе текущего окружения есть перехватчики, Angular игнорирует перехватчики во внешних диапазонах.
Именно это поведение можно изменить с помощью withRequestsMadeViaParent: Этот метод заставляет Angular также задействовать перехватчики во внешних областях.
Трудности при использовании withRequestsMadeViaParent¶
Обсуждаемая функция withRequestsMadeViaParent имеет неочевидный подводный камень: сервис в корневой области не знает о внутренней области и зарегистрированных в ней перехватчиках. Он всегда обращается к HttpClient в корневой области видимости, и поэтому выполняются только установленные там перехватчики:
Чтобы решить эту проблему, приложение может также зарегистрировать внешний сервис в массиве providers конфигурации маршрута и, таким образом, во внутренней области видимости.
В целом, однако, кажется, что отслеживать такие созвездия очень сложно. Поэтому, возможно, имеет смысл вообще обойтись без перехватчиков во внутренних диапазонах. В качестве альтернативы можно использовать очень общий перехватчик в корневой области видимости. Такой перехватчик может даже загружать дополнительную логику с помощью динамического импорта из частей ленивых приложений.
Устаревшие перехватчики и другие возможности¶
Хотя новые функциональные перехватчики очень очаровательны, приложения все еще могут использовать преимущества оригинальных перехватчиков, основанных на классах. Эту возможность можно включить с помощью функции withLegacyInterceptors. После этого перехватчики на основе классов должны быть зарегистрированы, как обычно, через мультипровайдер:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Дополнительные возможности¶
У HttpClient есть несколько дополнительных возможностей, которые также можно активировать с помощью with-функций: withJsonpSupport, например, активирует поддержку JSONP, а withXsrfConfiguration настраивает детали использования токенов XSRF. Если приложение не вызывает withXsrfConfiguration, используются настройки по умолчанию. Однако, чтобы полностью отключить использование токенов XSRF, вызовите withNoXsrfProtection.
Заключение¶
Пересмотренный HttpClient теперь прекрасно гармонирует с автономными компонентами и связанными с ними концепциями, такими как инжекторы окружения. Команда Angular также воспользовалась возможностью пересмотреть перехватчики: Теперь они могут быть реализованы в виде простых функций. Кроме того, появилась возможность рассматривать перехватчики во внешних диапазонах.
