Angular2 在获取资源时监视 302 重定向
Angular2 watch for 302 redirect when fetching resource
我需要从我公司持有的另一个域中提取一些资源。我想通过 GET 请求提取安全的 HTML 内容。
当用户退出应用程序时,请求的内容将 return 302 到登录页面。
我尝试嗅探 headers 以获得 302 的尝试尚未 returned 我所希望的。我的 Observable 的响应 return 是 200(登录页面)。
这是我的示例应用程序。
export class MenuComponent implements OnInit {
private _resourceUrl = "http://localhost:3001/resources/menu";
constructor(private _http: Http){
}
menu: string;
ngOnInit(): void {
this.getMenu()
.subscribe(
response => {
console.log(`Response status: ${response.status}`);
this.menu = response.text();
},
error => console.log(<any>error));
}
getMenu(): Observable<Response>{
return this._http.get(this._resourceUrl)
.map((response: Response) => response)
.catch(this.handleError);
}
private handleError(error: Response){
console.log(error);
return Observable.throw(error.json().error || 'Server Error');
}
}
我走在正确的轨道上吗?
如果服务器发送一个带有 URL 的 302 状态码重定向到 Location
header 内重定向,浏览器会自动处理重定向,即一个请求至此 URL 被执行。
这就是为什么 XHR(以及围绕它的 Angular2 包装器,即 Http
class)看不到第一个请求的结果而只能看到第二个请求的响应的原因。
这是我重定向到 ServiceData 的工作代码。 Angular2(4) 和 ASP 网络核心。
private post(url: string, data?: any) {
return this.http.post(url, data, { headers: this.headers })
.map(response => this.extractData(response, true));
}
private extractData(res: Response, mapJson = true) {
let body: any = res;
// redirect
if (body.url.search('ReturnUrl') != -1) {
let url = new URL(body.url);
// get patch redirect simple /account/login
let pathname = url.pathname;
// get params redirect simple ?ReturnUrl=%2Fapi%2Fitems%2FGetitems
let search = url.search;
// 1 navigate with params
this.router.navigate.navigate([pathname], { queryParams: { returnUrl: search } });
// OR ...
// 2 navigate only pathname
this.router.navigate.navigate([pathname]);
return {};
}
if (mapJson) {
body = body.json();
}
return body || {};
}
我需要从我公司持有的另一个域中提取一些资源。我想通过 GET 请求提取安全的 HTML 内容。
当用户退出应用程序时,请求的内容将 return 302 到登录页面。
我尝试嗅探 headers 以获得 302 的尝试尚未 returned 我所希望的。我的 Observable 的响应 return 是 200(登录页面)。
这是我的示例应用程序。
export class MenuComponent implements OnInit {
private _resourceUrl = "http://localhost:3001/resources/menu";
constructor(private _http: Http){
}
menu: string;
ngOnInit(): void {
this.getMenu()
.subscribe(
response => {
console.log(`Response status: ${response.status}`);
this.menu = response.text();
},
error => console.log(<any>error));
}
getMenu(): Observable<Response>{
return this._http.get(this._resourceUrl)
.map((response: Response) => response)
.catch(this.handleError);
}
private handleError(error: Response){
console.log(error);
return Observable.throw(error.json().error || 'Server Error');
}
}
我走在正确的轨道上吗?
如果服务器发送一个带有 URL 的 302 状态码重定向到 Location
header 内重定向,浏览器会自动处理重定向,即一个请求至此 URL 被执行。
这就是为什么 XHR(以及围绕它的 Angular2 包装器,即 Http
class)看不到第一个请求的结果而只能看到第二个请求的响应的原因。
这是我重定向到 ServiceData 的工作代码。 Angular2(4) 和 ASP 网络核心。
private post(url: string, data?: any) {
return this.http.post(url, data, { headers: this.headers })
.map(response => this.extractData(response, true));
}
private extractData(res: Response, mapJson = true) {
let body: any = res;
// redirect
if (body.url.search('ReturnUrl') != -1) {
let url = new URL(body.url);
// get patch redirect simple /account/login
let pathname = url.pathname;
// get params redirect simple ?ReturnUrl=%2Fapi%2Fitems%2FGetitems
let search = url.search;
// 1 navigate with params
this.router.navigate.navigate([pathname], { queryParams: { returnUrl: search } });
// OR ...
// 2 navigate only pathname
this.router.navigate.navigate([pathname]);
return {};
}
if (mapJson) {
body = body.json();
}
return body || {};
}