Angular 缺少 Http 错误状态
Angular Http Error status missing
我正在使用一个 Http 客户端,它是 Angular 4 的 Http 客户端
的扩展版本
export class SecurityClient extends Http {
// ...
}
在这个客户端中,我有尝试调用 api 的方法,我想捕获 401 状态以尝试刷新令牌。
我有一个这样的实现:
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return super.get(url, this._getOptions(options)).catch((initialError: any) => {
console.log('error: ' + JSON.stringify(initialError));
if (initialError && initialError.status === 401) {
return this.authService.doRefreshTokenObservable().flatMap((ok) => {
if (ok) {
return super.get(url, this._getOptions(options));
} else {
return Observable.throw('Authentication error');
}
});
} else {
return Observable.throw(initialError);
}
});
}
与 angular 在其页面中推荐的内容非常相似 (https://angular.io/docs/ts/latest/guide/server-communication.html)
但出于某种原因,第一个 console.log 显示如下内容:
error: {"_body":{"isTrusted":true},"status":0,"ok":false,"statusText":"","headers":{},"type":3,"url":null}
而且我根本无法获取状态码。
为什么会这样?这是因为我正在扩展 Httpclient 而我做错了什么?即使我变得很奇怪 status:0,控制台也显示红色字母:
"No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401."
(我们已经很好地配置了 CORS,如果 token 没有过期,我就成功地检索了信息)
首先,您可能需要仔细检查服务器上的 CORS 配置。我知道,我知道,你说你已经把它配置好了,我相信你,因为我自己经历过这个繁琐的过程。但是 CORS 响应完全来自服务器,不应该与您的 AngularJS 有任何关系。我亲眼见过 Django 设置,其中每个响应方法都有自己的 CORS 配置,因此可能未向未经身份验证的请求提供任何信息,包括甚至发出跨源请求的权限。
其次,关于错误代码,我的第一个想法是应该检查生成响应的服务器端代码。我从未见过 Angular return 不是直接来自服务器的响应代码(嘿,我还没有看到所有内容)。我的假设是,可能存在默认状态代码,或者从服务器 return 编辑的错误配置变量。
tl;dr: 看来 CORS
和 status: 0
这两个问题都是服务器上的问题。
两天的调试,就我而言,答案是在 URL.
的末尾添加反斜杠
website.com/api/create_user
没用...
website.com/api/create_user/
成功了!!!!
我正在使用一个 Http 客户端,它是 Angular 4 的 Http 客户端
的扩展版本export class SecurityClient extends Http {
// ...
}
在这个客户端中,我有尝试调用 api 的方法,我想捕获 401 状态以尝试刷新令牌。
我有一个这样的实现:
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return super.get(url, this._getOptions(options)).catch((initialError: any) => {
console.log('error: ' + JSON.stringify(initialError));
if (initialError && initialError.status === 401) {
return this.authService.doRefreshTokenObservable().flatMap((ok) => {
if (ok) {
return super.get(url, this._getOptions(options));
} else {
return Observable.throw('Authentication error');
}
});
} else {
return Observable.throw(initialError);
}
});
}
与 angular 在其页面中推荐的内容非常相似 (https://angular.io/docs/ts/latest/guide/server-communication.html)
但出于某种原因,第一个 console.log 显示如下内容:
error: {"_body":{"isTrusted":true},"status":0,"ok":false,"statusText":"","headers":{},"type":3,"url":null}
而且我根本无法获取状态码。
为什么会这样?这是因为我正在扩展 Httpclient 而我做错了什么?即使我变得很奇怪 status:0,控制台也显示红色字母:
"No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401."
(我们已经很好地配置了 CORS,如果 token 没有过期,我就成功地检索了信息)
首先,您可能需要仔细检查服务器上的 CORS 配置。我知道,我知道,你说你已经把它配置好了,我相信你,因为我自己经历过这个繁琐的过程。但是 CORS 响应完全来自服务器,不应该与您的 AngularJS 有任何关系。我亲眼见过 Django 设置,其中每个响应方法都有自己的 CORS 配置,因此可能未向未经身份验证的请求提供任何信息,包括甚至发出跨源请求的权限。
其次,关于错误代码,我的第一个想法是应该检查生成响应的服务器端代码。我从未见过 Angular return 不是直接来自服务器的响应代码(嘿,我还没有看到所有内容)。我的假设是,可能存在默认状态代码,或者从服务器 return 编辑的错误配置变量。
tl;dr: 看来 CORS
和 status: 0
这两个问题都是服务器上的问题。
两天的调试,就我而言,答案是在 URL.
的末尾添加反斜杠website.com/api/create_user
没用...
website.com/api/create_user/
成功了!!!!