我有一个有角度的应用程序,只要按照以下步骤添加serviceWorker:
https://github.com/angular/angular-cli/blob/master/docs/documentation/build.md#service-worker https://angular.io/guide/service-worker-getting-started
...我的API请求不再有Origin
请求标头,这似乎会导致我的API服务器不返回Access-Control-Allow-Origin
响应标头,从而导致浏览器错误:
请求的资源上没有'Access-Control-Allow-Origin'标头。
只需删除serviceWorker并取消注册即可将该行为恢复正常。
如何在继续使用我的restful API的同时实现serviceWorker?
所有请求都受到影响,但有些请求是由oidc-client
“引入”的;所有其他人看起来像:
public getBook(bookId: number): Observable<Book> {
const request = new HttpRequest(
'get',
`https://some-server.asurewebsites.net/api/book/${bookId}`,
{
reportProgress: true,
responseType: 'json'
}
);
return this.httpClient.request<any>(request).do(event => {
this.progressService.processEvent(event);
}).filter(event => event instanceof HttpResponse)
.map((response: HttpResponse<any>) => deserializeBook(response.body)).catch(error => {
if (error instanceof HttpErrorResponse) {
if (error.status === 404) {
return Observable.of(null);
}
}
return Observable.throw(error);
});
}
// note: other constraints require listening to progress from per-request level rather than using a HttpIntercepter.
UPDATE1:
手动设置Origin
我得到:
拒绝设置不安全的标题“Origin”
手动设置Access-Control-Allow-Origin
不会执行任何操作,因为它是响应标头。
Fetch API有一个 Request.mode
,当设置为'cors'
时,会发送一个OPTIONS
请求,其Origin
标头正常。我会尝试明确地设置它,但我在研究中遇到问题,或者在文档中找到如何使用angular HttpClient
UPDATE2:
我尝试将其中一个请求转换为使用Fetch API。所以我将Request.mode
设置为'cors'
,但我仍然没有Origin
个请求标头,也没有Access-Control-Allow-Origin
响应标头。
public getBookList(): Observable<BookList[]> {
const fetchHeaders = new Headers();
fetchHeaders.set('Authorization', 'Bearer ${token}');
const fetchRequest = new Request(`https://some-server.asurewebsites.net/api/book`, {
method: 'get',
headers: fetchHeaders,
mode: 'cors'
});
return Observable.fromPromise(fetch(fetchRequest).then(response => response.json()))
.map((results: any[]) => results.map(entity => deserializeBook(entity)));
}
TLDR
一旦服务工作者注册,浏览器就不再使用CORS,即使客户端明确设置了mode: 'cors'
。我如何使用服务工作者和CORS?
答案 0 :(得分:0)
转到托管您的API的服务器,然后对CORS配置进行以下更改。
从此更改允许的来源:
<AllowedOrigin>*</AllowedOrigin>
TO
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>