angular - 重新发送请求 Angular 2

标签 angular rxjs5 angular2-http

在 angular 2 应用程序中,对 API 的每个请求都有带有 token 的 header ,以防 token 过期 API 以 401 http 代码响应。我有一种更新 token 的方法,但是如何在获取新 token 的过程中重新发送先前暂停其他请求的请求?

最佳答案

您可以扩展 Http以这种方式类,使用 catch 捕获错误可观察的操作符:

一种方法是扩展 HTTP 对象以拦截错误:

@Injectable()
export class CustomHttp extends Http {
  constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
    super(backend, defaultOptions);
  }

  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    console.log('request...');
    return super.request(url, options).catch(res => {
      // do something
    });        
  }

  get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    console.log('get...');
    return super.get(url, options).catch(res => {
      // do something
    });
  }
}

并按如下所述进行注册:
bootstrap(AppComponent, [HTTP_PROVIDERS,
    new Provider(Http, {
      useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
      deps: [XHRBackend, RequestOptions]
  })
]);

catch 中定义的回调中运算符,您可以调用您的方法来更新 token ,获取结果,在源请求上设置新 token 并再次执行它。这将是完全透明的。

这是一个示例:
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    return super.get(url, options).catch(res => {
      if (res.status === 401) {
        return this.getToken().flatMap(token => {
          var sourceOptions = options || {};
          var headers = sourceOptions.headers || new Headers();
          headers.append('Authorization', token); // for example
          return super.get(url, options);
        });
      }

      return Observable.throw(res);
    });
  }

编辑

要“暂停”其他请求,您需要在 getToken 中实现一些缓存。使用 do 的方法和 share运营商:
getToken() {
  if (hasTokenExpired()) {
    this.token = null;
    this.tokenObservable = null;
  }

  if (this.token) {
    // Gotten the new token
    return Observable.of(this.token);
  } else if (this.tokenObservable) {
    // Request in progress...
    return this.tokenObservable;
  } else {
    // Execute the "refresh token" request
    return this.get('/refreshToken')
      .map(res => res.json)
      .do(token => {
        this.token = token;
        this.tokenObservable = null;
      })
      .share();
  }
}

关于angular - 重新发送请求 Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37306671/

相关文章:

RxJS (5.0rc4) : Pause and resume an interval timer

Angular:找不到不同的支持对象 '[object Object]'

forms - 类型 'http' 上不存在属性 'Component',Angular 2

angular - 路由到另一个组件后,服务返回时通知用户

angular - 当超过 6 个参数时,Observable.forkJoin 返回类型错误

angular - 如何使用 Reactive 表单设置单选按钮值?

angular - 在工作区库中使用 Angular 环境变量

javascript - Angular CLI 6 : How to consume a library sub-project in the main application?

angular - forkJoin 不适用于 AngularFire2 valueChanges

angular - Twilio video onParticipant{Disabled}VideoTrack 卡住视频