【问题标题】:Angular2 watch for 302 redirect when fetching resourceAngular2 在获取资源时监视 302 重定向
【发布时间】:2016-08-21 11:59:03
【问题描述】:

我需要从我公司持有的另一个域中提取一些资源。我想用 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');
    }
}

我是否走在正确的轨道上?

【问题讨论】:

    标签: angular rxjs angular2-http


    【解决方案1】:

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

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

    【讨论】:

    • 你能解释一下吗...(这里是初学者)
    • 那么,我无法通过 302 重定向来控制我的应用程序流程?
    • IE11 将带有空字符串的 302 响应解释为错误。有关让 HttpService 正确处理 IE11 内的重定向的任何建议?
    • 这根本不能回答问题。 OP 在询问如何检测它。
    • @speciesUnknown 它确实回答了这个问题,因为无法检测 302 重定向,因为浏览器在我们的 Angular 代码有机会检查响应之前控制了请求。
    【解决方案2】:

    这是我重定向到 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 || {};
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2020-11-19
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多