Angular с https-proxy-agent работает только с трейлингом / - что мне не хватает?

Я создал проект Angular с ngx-rocket.

  • Интерфейс Angular, работающий на localhost:4200
  • Серверная часть, обслуживающая api, по адресу locahlost:8000

Я использую предварительно настроенный https-proxy-agent с ngx-rocket для перенаправления моих запросов api с моего интерфейса на мой сервер. Раньше у меня были конечные точки api localhost:8000/api/endpoint и это раньше работало, но теперь переключили серверную часть на прослушивание localhost:8000/endpoint. Я адаптировал прокси, чтобы отразить эти изменения, но по некоторым причинам теперь он работает, только если я запрошу localhost:4200/endpoint/ с завершающей косой чертой, тогда как раньше этого не было.

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

proxy.conf.js

      const proxyConfig = [
  {
    context: '/api/*',
    pathRewrite: { '^/api': '' },
    target: 'http://localhost:8000/',
    changeOrigin: true,
    secure: false,
    logLevel: 'debug'
  }
];

environment.ts

      
export const environment = {
  production: false,
  version: env.npm_package_version + '-dev',
  serverUrl: '/api/',
  defaultLanguage: 'de-DE',
  supportedLanguages: ['de-DE', 'en-US'],
};

Пример услуги:

        private endpointUrl = 'endpoint';


  getEndpointList(): Observable<Endpoint[]> {
    return this.http
      .get<ApiResponse<Endpoint>>(this.endpointUrl)
  };

Эта конечная точка не работает, но раньше она работала со старой конфигурацией. Если я изменю его на private endpointUrl = 'endpoint/'; бывает, чтобы работать.

Текущее поведение:

Запрос http://localhost:4200/api/endpoint

  • Нет журнала прокси в угловой консоли

Сеть (инструменты разработчика Chrome):

  • Код состояния: 301
  • место расположения:
  • Результирующий запрос: http://localhost:4200/endpoint/

Запрос http://localhost:4200/api/endpoint/

  • [HPM] Rewriting path from "/api/endpoint/" to "/endpoint/"
  • [HPM] GET /api/endpoint/ ~> http://localhost:8000/

Сеть (инструменты разработчика Chrome):

  • Код состояния: 200
  • место расположения: /endpoint/
  • Возвращает ответ API

Ожидаемое поведение:

Запрос api должен работать без косой черты в конце. Боюсь, что это что-то глупое, но в настоящее время я не могу понять этого, поэтому я буду очень рад любой помощи.

1 ответ

Я решил это сейчас.

Я использовал django с инфраструктурой Django REST в качестве бэкэнда, который по умолчанию использует URL-адреса с завершающей косой чертой. Когда я открывал страницу в браузере, она работала и без косой черты, потому что меня автоматически переадресовывало. Эта пересылка не работала через прокси-сервер, потому что в ответе, отправленном с локального хоста:8000, указано местоположение /endpoint/что всегда приводило к localhost:4200.

Я исправил это, удалив завершающую косую черту в urls.py:

      router = routers.DefaultRouter(trailing_slash=False)

Кроме того, по какой-то причине мне пришлось удалить данные моего браузера.

Другие вопросы по тегам