проблемы с запросом URL при использовании базы href

Краткая версия: что мне нужно: как настроить службу angular2 http для игнорирования <base href>

Более длинная версия — на случай, если есть лучший подход: В моем проекте мы обслуживаем два угловых приложения с использованием Apache:

http://host/index.html - angular 1
http://host/ng2/index.html - angular 2

Они оба используют одну и ту же конечную точку

http://host/api/foo

Оба приложения используют один и тот же виртуальный хост. Приложение angular 2 находится в папке public/ng2 на диске.

Проблема сводится к следующему:

Когда я использую: <base href="/ng2/">, приложение angular загружается нормально. Однако все запросы к API с использованием службы http загрязняются.

http.get('/api/foo/2') goes to http://host/ng2/api/foo

Мое текущее решение состоит в том, чтобы установить для базового href значение <base href="/"> и поместить все файлы angular2, кроме index.html, непосредственно в /public. (index.html все еще находится в /public/ng2) Это работает, но это беспорядок.

Что я хотел бы иметь:

  • Все файлы angular2 находятся в /public/ng2 (работает из-за <base href="/ng2/"> или другой конфигурации Apache)
  • Outgoing requests do not have ng2 appended to them.

Невозможно жестко закодировать URL


person alfthan    schedule 26.01.2017    source источник
comment
Я бы рекомендовал иметь переменную $config с полным базовым URL-адресом вашего API для HTTP-вызовов и использовать http следующим образом: http.get(api_root + '/foo/2')   -  person Ki Jéy    schedule 26.01.2017
comment
спасибо @KiJéy. Я забыл упомянуть, что у нас развернуто несколько экземпляров. Каждый со своим /api/foo/2. Например. ( customer1-host/api/foo и customer2-host/api/foo). Так что относительный путь был бы намного лучше.   -  person alfthan    schedule 27.01.2017
comment
Можете ли вы объяснить, почему вы думаете, что относительный путь был бы лучше? Я согласен с @KiJéy, поместите URL-адрес в файл среды и используйте абсолютные пути.   -  person shusson    schedule 27.01.2017
comment
Проблема, которую я описал выше, наверняка может быть решена с использованием абсолютных путей. Когда я писал вопрос, я никогда серьезно не рассматривал возможность программного создания абсолютного пути. Например, fullUrl = document.location.protocol + // + document.location.host + / + relativeUrl. Этот подход действительно работает - так что спасибо!   -  person alfthan    schedule 27.01.2017


Ответы (2)


В конце концов я сделал то, что предложил Ки Джей, и использовал абсолютный URL-адрес для доступа к API.

service.base.ts: 
protected getAbsoluteUrl(relativeUrl : String) : String { 
  return document.location.protocol + "//" + document.location.host + "/" + relativeUrl
}

service.ts:
class service extends BaseService
  getTheFoo(){ 
    http.get(this.getAbsoluteUrl(foo/2))...
  }
person alfthan    schedule 27.01.2017

простое добавление '/' к вызову API перестанет добавлять значение baseHref.

  getFoo(): Observable<any> {
    const url = '/' + 'api/foo';
    return this.http.get<any>(url);
  }
person Imtiaz Shakil Siddique    schedule 10.06.2020