我目前正在开发一个带有 java 后端的 Angular 应用程序。到目前为止,一切似乎都有效,但现在我遇到了一个无法解释的问题。有一个 GET 请求不起作用。其他一切都有效。但有趣的是,它只在 Firefox 中不起作用。
当我打印出 observable 的错误时,这会在控制台中显示:
{
"headers": {
"normalizedNames": {},
"lazyUpdate": null,
"headers": {}
},
"status": 0,
"statusText": "Unknown Error",
"url": null,
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for (unknown url): 0 Unknown Error",
"error": {
"isTrusted": true
}
}
当我查看网络选项卡时,请求未执行。甚至没有预检 OPTIONS 请求。
我红了几个提示,我将成为 CORS 问题。但我相信这里不是这样。我的 CORS 标头设置正确:
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Authorization
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS, HEAD
Access-Control-Allow-Origin: *
Content-Type: application/json
(通常我会为 CORS 标头设置一个更具体的域列表,但我将其设置为 '*' 只是为了确定)
不工作的请求在资源上/ads/:id
。请求/ads
和所有其他请求都可以正常工作。所有资源都通过 Jersey 实现。并且有问题的请求不受任何身份验证或授权的约束。
回顾一下:仅在 Firefox 中只有一个请求不起作用。如果我直接访问 URL(而不是通过角度),一切正常。
我在这里有点绝望。任何帮助表示赞赏。
澄清:
- 开发人员控制台中没有错误或其他内容(Firefox 和 chrome 中都没有)
- 在网络选项卡中没有从浏览器发出的请求
- 服务器端没有请求进入
- 上面的错误来自
console.log(err)
- 使用 angular v5.2.9 和 HttpClient
缩小问题范围
我的完整网址是http://localhost:8080/api/v1/ads/1
. 并猜测问题出在哪里/ads
。我完全不知道究竟是什么原因造成的。我尝试了其他几个 URL,例如/ad
/adsf
/adsa
等,它们都有效。
我还将Angular缩小到这个范围:
import { Component, OnInit } from '@angular/core';
import { AdService } from '@app/shared/services/ad/ad.service';
import { HttpClient } from '@angular/common/http';
class Ad {
id: number;
title: string;
}
@Component({
selector: 'fwas-ad-detail',
template: `
<div *ngIf="isError">
<h1>Error</h1>
</div>
<div *ngIf="!isError">
<h1>{{ad?.title}}</h1>
</div>
`
})
export class AdDetailComponent implements OnInit {
url = 'http://localhost:8080/api/v1/ads';
ad: Ad;
isError = false;
constructor(private http: HttpClient) { }
ngOnInit() {
const queryUrl = this.url + '/' + '1';
this.http.get<Ad>(queryUrl).subscribe(
data => { this.ad = data; },
err => { this.isError = true; }
);
}
}
我也用json 服务器试了一下,效果很好。
所以问题只存在于以下情况:
- 上面的角度5代码
- 火狐 59.0.3(64 位)
- Jersey2/Jackson2 API
- 在
/ads
URL 中,但不是最后一部分(http://localhost:8080/api/v1/ads
一直有效)
我为我找到了一种解决方法(不在网址中使用广告),但如果有人感到无聊并想弄清楚这一点,我很想知道这个谜团的确切原因是什么。