Angular 2 - 使用 "multi" 提供商覆盖 Http

Angular 2 - Using "multi" provider to override Http

我想用自定义 class 覆盖 Http,说 HttpClient 在请求之前和响应之后做一些操作,但是我不想必须请记住导入 class 而不是平台 http class。

我一直在尝试通过 'multi' 提供程序执行此操作,但我无法完全点击它。

这是我的覆盖 class:

import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';

@Injectable()
export class HttpClient {
  private http: Http;

  constructor(http: Http) {
    this.http = http;
  }

  get(url) {
    let headers = new Headers();
    doSomethingToHeader(headers);
    return this.http.get(url, {
      headers: headers
    });
  }
}

这是我的 main.ts

bootstrap(AppComponent, [
  provide(HTTP_PROVIDERS, {useExisting: HTTP_PROVIDERS, multi: true}),
  provide(HTTP_PROVIDERS, {useClass: HttpClient, multi: true})
]);

但是当我尝试在我的应用程序中调用 http.get() 时,我得到

ORIGINAL EXCEPTION: No provider for Http!

有什么想法吗?我是不是用错了方法?

谢谢!

更新

我找到了这个 blog post。它几乎描述了 Gunter 在下面描述的内容。我接受他的回答。

multi: true 仅当提供程序被设计为像 PLATFORM_DIRECTIVES 这样的 multi 提供程序时才有效。 HTTP_PROVIDERS 不是 multi 提供商,它只是单个提供商的集合。

你能做的是

bootstrap(AppComponent, [HTTP_PROVIDERS, {provide: Http, useClass: HttpClient}])

循环结果(见评论)

这应该有效:

bootstrap(AppComponent, [
  HTTP_PROVIDERS, 
  {
    provide: Http, 
    useFactory: (backend, defaultOptions) => new HttpClient(new Http(backend, defaultOptions)),
    deps: [XHRBackend, RequestOptions]
  }
])

重要的部分是覆盖 HTTP_PROVIDERS 中定义的提供者的自定义提供者 您要覆盖的提供者之后。因此 HTTP_PROVIDERS{provide: Http, ...}

之前很重要

使用 multi: true,您不会覆盖提供程序,而是将另一个项目添加到提供一组值的提供程序。