2016-04-27 5 views
5

Ich habe eine Anforderung, ein paar Ressourcen aus einer anderen Domäne, die von meiner Firma gehalten wird, zu ziehen. Ich möchte gesicherten HTML-Inhalt mit GET-Anforderungen abrufen.Angular2 Uhr für 302 Redirect beim Abrufen der Ressource

Wenn ein Benutzer aus der Anwendung abgemeldet wird, wird der angeforderte Inhalt eine 302 auf die Anmeldeseite zurückgeben.

Meine Versuche, die Header für eine 302 zu schnüffeln haben nicht zurückgegeben, was ich bis jetzt gehofft hatte. Die Antwort, die von meinem Observable zurückgegeben wird, ist eine 200 (Anmeldeseite).

Hier ist meine Beispiel-App.

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'); 
    } 
} 

Bin ich sogar auf dem richtigen Weg?

Antwort

10

Wenn der Server eine Weiterleitung mit einem 302-Statuscode mit der URL zur Weiterleitung innerhalb eines Location-Headers sendet, wird die Weiterleitung automatisch vom Browser verarbeitet, d. H. Eine Anforderung an diese URL wird ausgeführt.

Deshalb wird XHR (und der Angular2-Wrapper darum, d. H. Die Http-Klasse) das Ergebnis der ersten Anfrage nicht sehen, sondern nur die Antwort der zweiten.

+0

können Sie ein bisschen mehr erklären ... (Anfänger hier) –

0

Dies ist mein Arbeitscode zum Umleiten zu ServiceData. Angular2 (4) und ASP-Netzkern.

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