我的http服务无法正确捕获某些http错误。 catch方法有2个不同的响应对象(见下文)。
private fireRequest(request: Request): Observable<any> {
return this.http.request(request)
.switchMap((response: Response) => {
const responseData = response.json() || [];
return Observable.of(responseData);
})
.catch((response: Response) => {
const res2 = response.json();
// filters http errors from status 0 errors
if (response.status && response.status > 0) {
const res = response.json();
return Observable.of<any>(res);
}
const unexpectedNetworkError = new
Error('commons.unexpected_network');
return Observable.throw(unexpectedNetworkError);
})
}
奇怪的错误行为。 (即使在chrome网络标签中我也看不到http主体)
// catch 404 error
{
headers: Headers,
ok: false,
status: 0,
statusText : "",
type : 3,
url : null,
_body : ProgressEvent
}
纠正错误行为
// catch 401 error
{
headers: Headers,
ok: false,
status: 401,
statusText : "Unauthorized",
type : 2,
url : http://api.service/users,
_body : { // json body}
}
答案 0 :(得分:4)
我发现问题与浏览器及其CORS行为有关。
a)成功通话
BROWSER SERVER
| ------ preflight ---> |
| <-- allow GET, PUT -- |
| ------- GET req ----> |
| <------ GET res ----- |
b)支持回复404而非200
的呼叫失败BROWSER SERVER
| ---- preflight ----> |
| <------ 404 -------- |
| |
| |
c)没有互联网连接,没有来自服务器的响应
BROWSER SERVER
| ---- preflight ----> X
| |
| |
| |
每当您对不存在的ruote进行api调用时,浏览器都会发送预检请求(b)。
取决于您可以收到的后端错误处理策略:
1) Http 404代码,正文中包含错误详细信息 在这种情况下,浏览器返回http状态代码为0的一般错误,而不包含实际服务器的有效负载。从来没有进行过第二次调用,因为自从预检错误以来没有任何意义。
2)预检的Http 200代码和实际通话的404代码。 在这种情况下一切正常。
如果没有互联网连接,问题仍然存在。