У меня запущено приложение Angular, которое использует внешний API для получения ISO стран. Этот API использует https и выдает ошибку.
Дело в том, что когда я использую прокси в моей локальной среде angular, отображение /iso-api/
на реальный URL работает нормально.
"/iso-api/*": {
"target": "https://www...",
"pathRewrite": { "^/iso-api": "" },
"secure": false,
"changeOrigin": true,
"logLevel": "debug"
}
Но я хочу, чтобы это работало на производстве, поэтому я хочу использовать реальный URL.
На моем сервере я уже возвращаю заголовок Access-Control-Allow-Origin: *
.
I ' Я пытался запустить сервер angular с помощью ssl (поскольку внешний API-интерфейс использует https), но я получаю ту же ошибку.
Я знаю, что решение будет заключаться в реализации прокси на сервере, но я считаю, это не должно быть сделано, и может быть способ извлечь эти данные из внешнего интерфейса. Помогите пожалуйста.
Ответ
Это сетевая ошибка в Chrome:
В Firefox, запрос заканчивается на 200 OK и возвращает данные, но выдается ошибка CORS, и я не могу получить доступ к данным из приложения: CORS header 'Access-Control-Allow-Origin' missing
General
Request URL: https://www...
Referrer Policy: no-referrer-when-downgrade
Заголовки запроса
:method: GET
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: es-ES,es;q=0.9,en;q=0.8
origin: http://localhost:4200
referer: http://localhost:4200/app/login
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: cross-site
Заголовки ответа
accept-ranges: bytes
cache-control: max-age=0
content-encoding: gzip
content-language: en-US
content-length: 68356
content-type: application/json
date: Mon, 27 Apr 2020 14:49:30 GMT
expires: Mon, 27 Apr 2020 14:49:30 GMT
referrer-policy: strict-origin-when-cross-origin
server-timing: cdn-cache; desc=HIT
server-timing: edge; dur=1
server-timing: ACTT;dur=0,ACRTT;dur=88
set-cookie: ... expires=Mon, 27 Apr 2020 16:49:30 GMT; max-age=7200; path=/; domain=...; HttpOnly
set-cookie: ... Domain=...; Path=/; Expires=Mon, 27 Apr 2020 18:49:30 GMT; Max-Age=14400; HttpOnly
set-cookie: ... Domain=...; Path=/; Expires=Tue, 27 Apr 2021 14:49:30 GMT; Max-Age=31536000; Secure
status: 200
vary: Accept-Encoding
ОБНОВЛЕНИЕ
Angular сервисный код
import { HttpClient } from '@angular/common/http';
...
constructor(
private _http: HttpClient,
private _errorUtil: ErrorUtilService,
private _converter: StoreConverter
) {}
...
getCountries(): Observable<CountryWithLanguages[]> {
return this._http.get<GetStoresResponse>(API.storeUrl).pipe(
catchError(this._errorUtil.handle),
map(result => result.stores),
switchMap(stores => stores),
filter(this._isActiveStore),
map(store => this._converter.toView(store)),
toArray()
);
}
Для обслуживания приложения, которое я использую angular dev server, я не добавляю заголовок «Access-Control-Allow-Origin» вручную, но в браузере вижу, что оно добавляется.
angular. json
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "push-web-app:build",
"proxyConfig": "src/proxy-local.conf.json"
},
}