Angular 2 как перенаправить после отдыха http post / put согласно возвращенному коду состояния
Я пытаюсь перенаправить / перенаправить его на определенную страницу после успеха и неудачи моего запроса http put. API возвращает некоторые коды состояния в соответствии с успехом или ошибкой (500, 401, 200 и т. д) Я не знаю, как справиться с этим перенаправлением
Мой служебный код показан ниже
putCustomer(body: string){
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers, method: 'put', withCredentials: true });
return this.http.put(this._customerUrl, body, options)
.map(res => res.json())
.catch(this.handleError)
.subscribe();
}
private handleError (error: Response) {
console.error(error);
return Observable.throw(error.json().error || ' error');
}
Пожалуйста, помогите.
Обновление: некоторые незначительные поправки к ответу Фредрика:
import { Injectable } from '@angular/core';
import {Http, Response} from '@angular/http';
import {Headers, RequestOptions} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import { Router } from '@angular/router';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/do';
.........
constructor(private router: Router, private http: Http) { }
putCustomer(body: string){
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers, method: 'put', withCredentials: true });
//alert(body);
return this.http
.put(this._customerUrl, body, options)
.do(res => {
if(res.status === 200 ||res.status === 201) {
this.router.navigate(['/success']);
}
else if(res.status === 401){
this.router.navigate(['/error']);
}
else if(res.status >= 500){
this.router.navigate(['/error']);
}
})
.map(res => res.json())
.catch(this.handleError)
.subscribe();
}
private handleError (error: Response) {
console.error(error);
return Observable.throw(error.json().error || ' error');
}
}
2 ответа:
Используйте
Response.status
, чтобы получить код состояния из ответа http. Затем используйтеRouter.navigate(...)
для перенаправления. Вы можете использовать операторdo
на наблюдаемом для выполнения побочного эффекта перехода на другой маршрут.Фрагмент:
.do(res => { if(res.status === '200') this.router.navigate(['/somewhere']); else if(......) ...; })
Более полный пример для интеграции с вашим кодом:
import { Router } from '@angular/router' ... export class YourClass { constructor(router: Router, ...) {} putCustomer(body: string){ ... return this.http .put(this._customerUrl, body, options) .do(res => { if(res.status === '200') this.router.navigate(['/somewhere']); else if(......) ...; }) .map(res => res.json()) .catch(this.handleError) .subscribe(); }