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)
Кроме того, по какой-то причине мне пришлось удалить данные моего браузера.