Я пытаюсь получить некоторые данные с внутреннего сервера в Angular 6, чтобы я мог визуализировать их по-своему.Я уже подготовил рабочий запрос GET, который приводит к правильному ответу со всеми необходимыми мне данными, но проблема в том, что когда он используется обычным образом, например, в «обычном» браузере, я получаю ошибку CORS -заголовок отсутствует.Так как мне получить данные даже с этой проблемой?Как правило, вы должны разрешить это на стороне сервера, но эта ситуация немного отличается.Я установил плагин Chrome, чтобы добавить заголовок к каждому запросу.С плагином проблема CORS больше не существует.
Так что мой вопрос в том, как (и если) я могу добавить заголовок CORS в своем коде Angular к ответу, чтобы мне не пришлось использовать какие-либоплагины и приложение будут работать в каждом браузере?
Кроме того, просто для предотвращения каких-либо комментариев, все данные, которые я получаю, имеют законный доступ, они мои собственные, и я просто изучаю новые вещи.в угловых.Насколько я знаю, я должен использовать перехватчики, но я почти уверен, что делаю это неправильно.Вот мой код:
Метод службы http:
getFullResponse(domain: string, projectName: string, credentials: Credentials) {
console.log('RequestService method getIssuesForProject() fired');
return this.http.get('https://' + domain + '.myserver.local/api/' + projectName,
{
headers: new HttpHeaders({'Authorization': 'Basic ' + btoa(credentials.username + ':' + credentials.password)}),
observe: 'response'
}
);
}
Класс перехватчика, который я написал:
import {Injectable} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';
import {Observable} from 'rxjs';
import {map} from 'rxjs/operators';
@Injectable()
export class ResponseInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(
map(event => {
if (event instanceof HttpResponse) {
event = event.clone({
headers: event.headers.set('Access-Control-Allow-Origin', '*')
});
}
return event;
})
);
}
}
Это класс component.ts:
import {Component, OnInit} from '@angular/core';
import {RequestService} from '../../shared/service/RequestService.service';
import {Credentials} from '../../shared/model/credentials';
@Component({
selector: 'app-project',
templateUrl: './project.component.html',
styleUrls: ['./project.component.css']
})
export class ProjectComponent implements OnInit {
projectKey = '';
headers;
credentials: Credentials;
constructor(private reqService: RequestService) {
}
ngOnInit() {
}
onSubmit(domainName: string, projectKey: string, user: string, password: string) {
this.projectKey = projectKey;
this.credentials = {
username: user,
password: password
};
this.reqService.getFullResponse(domainName, projectKey, this.credentials)
.subscribe(resp => {
const keys = resp.headers.keys();
this.headers = keys.map(key => `${key}: ${resp.headers.get(key)}`);
});
}
}
Я пытался использовать Interceptor способом по этой ссылке , используя app.module.ts.Это полностью сломало мое приложение, потому что я получаю ошибку CORS даже при включенном плагине CORS.Другие примеры кода, которые я нашел в Интернете, использовали код, такой как
return next.handle(reqClone)
.map(event => {
if (event instanceof HttpResponse) {
event = event.clone({
headers: event.headers.set('x-test-res', 'res-test-header')
});
}
return event;
});
в перехватчике, но я предполагаю, что это для более старых версий Angular, я не могу использовать метод map
таким образомпоэтому я попытался использовать его внутри pipe
, как это было использовано в документации .Хотя я все еще что-то упускаю.