Angular2 следит за редиректом 302 при получении ресурса
У меня есть требование получить несколько ресурсов из другого домена, принадлежащего моей компании. Я хочу получить защищенный HTML-контент с помощью запросов GET.
Когда пользователь выходит из приложения, запрошенный контент вернет 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 ответа
Если сервер отправляет перенаправление с кодом состояния 302 с URL-адресом для перенаправления в Location
заголовок, перенаправление автоматически обрабатывается браузером, т.е. выполняется запрос к этому 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 || {};
}