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 2

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

Просто импортируйте маршрутизатор

import { Router } from '@angular/router';

Затем введите его в конструктор:

constructor(private router: Router) {}

Затем используйте маршрутизатор для перенаправления

this.router.navigate(['/nextPage']);