Angular 2 拦截器无法正常工作

标签 angular http angular-http angular-http-interceptors

我正在尝试创建一个自定义 http 类,它扩展 Http 以像 Angular 2 上的 AngularJS 拦截器一样工作。我关注了其他 Stackoverflow 问题和一些教程,但我总是遇到相同的错误,但我找不到解决方案。

我有以下 Http 拦截器:

import { Injectable } from '@angular/core';
import { Http, ConnectionBackend, RequestOptions, RequestOptionsArgs, Response, Headers, Request } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/Rx';

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

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
        options = new RequestOptions();
        let headers = new Headers();
        headers.append('X-Auth-Token', 'Bearer ' + localStorage.getItem('access-token'));
        options.headers = headers;
        return super.request(url, options);
    }
}

然后我将它添加到 app.module 中,如下所示:

  providers: [{
    provide: Http,
    useFactory: loadCustomHttp,
    deps: [XHRBackend, RequestOptions]
  }],

  export function loadCustomHttp(backend: XHRBackend, defaultOptions: RequestOptions) {
  return new CustomHttp(backend, defaultOptions);
}

我没有收到此配置的任何错误,但是当我发出任何请求时,我收到 401,因为未添加身份验证 header 。示例请求可以是:

import { Http } from '@angular/http';

  getExample() {
    let url = this.urlBase + '/test';

    return this.http.get(url);
  }

任何帮助将不胜感激,提前致谢:)

最佳答案

url 可以是两种不同类型之一,string 或 Request,所以

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
let token = localStorage.getItem('access-token');

if (token) {
  if (typeof url === 'string') {
    if (!options) {
      options = { headers: new Headers() };
    }
    options.headers.set('Authorization', `Bearer ${token}`);
    console.log('Url is string', options.headers.get('Authorization'));
  } else {
    url.headers.set('Authorization', `Bearer ${token}`);
    console.log('Url is Request', url.headers.get('Authorization'));
  }
}

return super.request(url, options);
}

关于Angular 2 拦截器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45297694/

相关文章:

angular - 使用 Angular 5 中的 contentChildren 获取多个 ng-template ref 值

javascript - 将 Angular 添加到现有的 CodeIgniter 项目

http - 来自 j2me 的 POST HTTP 请求

angularjs - 将日期时间从 angular $http.get 请求传递给 Web API 2 Controller

javascript - 无法读取未定义的属性 'post' - Angular 2

javascript - $http 响应拦截器 header

Angular Observables 和 Http

css - 有 Angular Dynamic Form Generator Bootstrap CSS 问题

java - 如何使用 CloudFoundry.com 在云中运行 Java SE 应用程序?

json - 这个 oAuth token 的 HTTP 请求应该如何格式化?