Настройка URL-адреса API в приложении Angular

#angular #typescript #angular-config

Вопрос:

В настоящее время я использую proxy.conf.json для настройки URL API для разработки. Я считаю, что он работает только на локальном сервере. Как я могу настроить URL-адрес API при его развертывании на UAT и рабочем сервере? Я хотел бы изменить URL-адрес API на сервере без повторного построения всего приложения.

proxy.conf.json:

 {
    "/api": {
      "target": "http://api_server:88",
      "secure": false,
      "pathRewrite": {
      "^/api": ""
    },
      "changeOrigin": true
    }
  }
 

api.service.ts:

 get<T>(params: any = {}) : Observable<T> {
    return this.http.get<T>("/api/data", {params: params});
}
 

Ответ №1:

Конфигурации прокси-сервера в proxy.conf.json файле предназначены для того, чтобы ваш сервер разработки Webpack запускал ваше приложение Angular локально с помощью ng serve команды. Его не следует использовать для производственных и промежуточных сред. Вы можете найти подробную информацию об этом на официальной странице Angular docs.

Если вы хотите добавить аналогичную функцию на свой NodeJS или любой другой сервер, на котором размещается ваше приложение angular, проверьте, доступны ли плагины API-шлюза для используемого вами сервера.

Проверьте эту статью, если вы не знаете о шлюзах API.

Комментарии:

1. Спасибо, Шраван. Я развертываю его в IIS. Мне было интересно, есть ли какой-нибудь более простой вариант, чем добавление дополнительной зависимости Nginx. Я ожидаю, что это должно быть что-то встроенное, поскольку это очень простой вопрос.

Ответ №2:

Этот способ отлично работает для нас:

  1. Создайте пользовательскую службу HTTP и создайте функцию, которая будет проверять текущий URL-адрес.

пользовательский-http.service.ts

 @Injectable()
export class CustomHttpService {

    constructor(private http: HttpClient) {
    }

    public getCurrentEnvironment(): string {
        const host = window.location.origin;
        let env = "";
        switch(host) {
            case 'http://localhost:4200': {
                env = 'LOCALDEV';
                break;
            }
            case 'https://my-test-site.azurewebsites.net': {
                env = 'TEST';
                break;
            }
            case 'https://my-prod-site.azurewebsites.net': {
                env = 'PROD';
                break;
            }
            case 'https://customdomain.com': {
                env = 'PROD';
                break;
            }
            default: {
                env = 'PROD';
                break;
            }

        }
        return env;
    }

    public get(url: string): Observable<any> {
        return this.http.get(url);
    }

    public getWithHeader(url: string, header: HttpHeaders): Observable<any> {
        return this.http.get(url, {headers: header});
    }

    public post(url: string, body: any): Observable<any> {
        return this.http.post(url, body);
    }

    public put(url: string, body: any): Observable<any> {
        return this.http.put(url, body);
    }

    public delete(url: string): Observable<any> {
        return this.http.delete(url);
    }
}
 

Вы можете вызвать getCurrentEnvironment() из любого места вашего приложения, чтобы узнать, в какой среде вы находитесь.

  1. Создайте вспомогательную службу URL-адресов, она будет передавать правильный URL-адрес API для вашей конкретной среды.
 @Injectable()
export class URLHelper {
    constructor(private httpService: CustomHttpService) {

    }

    private env: string = this.httpService.getCurrentEnvironment();
    private Server: string = this.getServerUrl(this.env);

    getServerUrl(env: string): string {
        let server = "";
        switch (env) {
            case "LOCALDEV": {
                server = "http://localhost/project/";
                break;
            }
            case "TEST": {
                server = "https://my-test-site-api.azurewebsites.net/";
                break;
            }
            case "PROD": {
                server = "https://my-prod-site-api.azurewebsites.net/";
                break;
            }
            default: {
                console.error('No Env Found');
                server = "https://my-prod-site-api.azurewebsites.net/";
            }
        }
        return server;
    }

    // Here you will define all the API endpoints your app will use and 'this.Server ' will contain the proper host API server url at runtime for each environment.
    public User = this.Server   'api/User';
 
  1. Использование. Чтобы использовать это сейчас, все, что вам нужно сделать, это в любой из ваших служб функциональных модулей добавить CustomHttpService и UrlHelper в конструктор
 @Injectable()
export class AdminService {

    constructor(private urlHelper: URLHelper, private httpService: CustomHttpService) { }

    getUser(): Observable<any> {
        return this.httpService.get(this.urlHelper.User);
    }

}
 

Комментарии:

1. Спасибо, Брайан. Это выглядит как хороший вариант. Как указать, какую среду использовать на сервере? Это происходит во время сборки? например, ng serve -env=ТЕСТ?

2. Функция getCurrentEnvrionment просматривает текущий URL-адрес в окне просмотра window.location.origin . Все, что вам нужно сделать ng serve , это открыть свой браузер на localhost:4200 , и функция getCurrentEnvrionment вернет LOCALDEV, и ваш хост API будет использовать http://localhost/project/ в этом случае. Вам не нужно делать ничего лишнего.

3. я вижу, в этом есть смысл. Единственным недостатком является то, что любое изменение URL-адреса потребует перестройки приложения angular, в то время как на самом деле это должно быть изменение конфигурации. Ты согласен?

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

5. Да, я согласен. Я думаю использовать файл json в папке assets и получить URL-адрес из файла JSON, чтобы его можно было изменить без компиляции. Видите ли вы какие-либо недостатки в использовании этого подхода?