Как прочитать файл конфигурации, чтобы задать URL-адрес API внутри Angular App, упакованного как WAR и развернутого в IBM Liberty - PullRequest
0 голосов
/ 28 июня 2019

Я запустил ng build --prod и скопировал содержимое папки /dist в папку webapps динамического веб-проекта.

Затем я пытаюсь экспортировать этот проект как файл .war и развернуть его на сервере Liberty. Проблема в том, что я установил URL-адреса API внутри environment.prod.ts.

Так что в случае, если мне нужно изменить URL API, мне нужно повторно запустить ng build и скопировать содержимое /dist, а затем экспортировать как .war.

Я попытался установить базовый URL-адрес API на window.location.origin, поскольку базовый URL-адрес будет таким же для нашего приложения Angular и микросервисов.

Мы хотим вместо этого сделать URL-адрес API настраиваемым извне. Например, мы создали окончательный файл .war, но когда мы развертываем его как контейнер на докере, мы читаем некоторый файл конфигурации и устанавливаем его как URL-адрес API.

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Поскольку вы используете Liberty, вы можете создать конечную точку, используя JAX-RS (учебник по JAX-RS здесь ), который считывает необходимые базовые URL-адреса из файла или переменных среды (Вы можете использовать стандартные API Java или что-то вроде MicroProfile Config ) и возвращать их в качестве ответа.Упакуйте это как часть вашего .war файла.

Затем, при запуске , ваше приложение Angular может сделать запрос к этой конечной точке (которую вы всегда будете знать, поскольку онаЭто будет то же окно window.location, из которого исходит само приложение Angular, просто другой контекст-корень и / или путь.) Это даст ему информацию, необходимую для работы.

0 голосов
/ 28 июня 2019

1-е решение:

Вы можете включить сборку ng, создание файла war и развертывание в один и тот же Dockerfile и, таким образом, установить непосредственно API_URL перед этапом сборки ng. Но это заставит вас перестраивать контейнер каждый раз, когда вы меняете API_URL (что, насколько я понимаю, вы делаете каждый раз, когда вы передислоцируете свою войну).

2-е решение:

Итак, я собираюсь сделать некоторые предположения для этого первого решения.

Из того, что вы сказали, я предполагаю, что вы работаете над архитектурой микросервисов. Я также предполагаю, что все ваши микросервисы доступны через одну конечную точку, которая является шлюзом API.

Возможным решением было бы предоставить фиксированную конечную точку через шлюз API, которую Angular App будет использовать для получения API_URL (например: / api / url). Это решит все ваши проблемы, поскольку вы можете заставить эту конечную точку (/ api / url) возвращать все, что вы хотите.

Вы можете сделать так, чтобы он возвращал URL-адрес, полученный из какого-либо хранилища / микросервиса конфигурации, который вы можете легко изменить в любой момент времени.

Единственный минус, который я вижу, это то, что вы будете зависеть от этого URL, чтобы ваше приложение работало. Что делает его единственной точкой отказа. Хотя вы можете обойти это, используя некоторые резервные API, если конечная точка / api / url не работает.

0 голосов
/ 28 июня 2019

1) Вы можете иметь файлы json для конфигурации и добавлять их в папку активов и ссылаться на эти файлы как apis из кода, так что вам не нужно будет перестраивать их, просто замените файл содержимого в ресурсах, и он сработаетиз коробки.

2) Вы также можете использовать динамический импорт, но в этом случае вам понадобится настроенный сборочный пакет для адресации вашего файла.

...