[英]How to read config file to set API URL inside an Angular App packaged as a WAR and deployed on IBM Liberty
我已經運行ng build --prod
並復制了動態Web項目的webapps文件夾內/dist
文件夾的內容。
然后,我嘗試將該項目導出為.war
文件並將其部署在Liberty服務器上。 挑戰在於,我已經在environment.prod.ts
設置了API URL。
因此,如果需要更改API URL,則需要重新運行ng build
並復制/dist
內容,然后將其導出為.war
。
我嘗試將API基本URL設置為window.location.origin
因為對於Angular應用程序和微服務而言,基本URL相同。
我們想要的是改為使API URL可從外部配置。 例如,我們創建了最終的.war文件,但是當將其作為容器部署在docker上時,我們讀取了一些配置文件並將其設置為API URL。
由於使用的是Liberty,因此可以使用JAX-RS( 此處為 JAX-RS的教程)創建一個端點,該端點從文件或環境變量中讀取所需的基本URL(可以使用標准Java API或類似的東西) MicroProfile Config )並返回它們作為響應。 將其打包為.war
文件的一部分。
然后,在啟動時 ,您的Angular應用程序可以向該端點發出請求(您將始終知道該端點的位置,因為它將是同一窗口.Angular應用程序本身來自的位置,只是一個不同的上下文根和/或路徑。)這將為其提供工作所需的信息。
1)您可以擁有用於配置的json文件,並將其添加到資產文件夾中,然后從代碼中將這些文件引用為api,因此您無需為這些文件進行重建,只需替換資產中的內容文件即可使用。
2)您也可以使用動態導入,但是在這種情況下,您將需要具有自定義的build-pack來處理文件。
您可以在同一Dockerfile中包含ng構建,war文件創建和部署,從而在ng構建步驟之前直接設置API_URL
。 但這會使您每次更改API_URL
時都重新構建一個容器(據我了解,這是您每次重新部署戰爭時所做的工作)。
因此,我將為第一個解決方案做出一些假設。
根據您所說的,我假設您正在開發微服務架構。 我還將假設所有您的微服務都通過一個端點(即API網關)公開。
一種可能的解決方案是通過您的API網關公開一個固定端點,Angular App將使用該API_URL
獲取API_URL
(例如:/ api / url)。 這樣可以解決所有問題,因為您可以使端點(/ api / url)返回所需的內容。
您可以對其進行設置,以使其返回從某個配置存儲/微服務獲取的URL,您可以在任何給定時間輕松對其進行修改。
我唯一看到的缺點是您將依賴該URL來使您的應用程序正常工作。 這使其成為單點故障。 雖然您可以使用一些后備api繞過此操作,以防/ api / url端點不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.