Angular2在获取资源时监视302重定向

时间:2016-04-27 09:22:15

标签: angular rxjs angular2-http

我需要从我公司持有的其他域中提取一些资源。我想通过GET请求提取安全的HTML内容。

当用户退出应用程序时,请求的内容将返回302登录页面。

我试图嗅到302避风港的标题已经归还了我迄今为止所希望的。我的Observable返回的响应是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');
    }
}

我是否在正确的轨道上?

2 个答案:

答案 0 :(得分:21)

如果服务器发送带有302状态代码的重定向,并在Location标头内重定向该URL,则重定向将由浏览器自动处理,即执行对此URL的请求。

这就是为什么XHR(以及它周围的Angular2包装器,即Http类)不会看到第一个请求的结果,而只会看到第二个请求的响应。

答案 1 :(得分:0)

这是我重定向到ServiceData的工作代码。 Angular2(4)和ASP net Core。

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 || {};
}