针对 Angular2 版本 2.2(截至2016年12月)
自 RC5 起,Angular 将 HTTP_PROVIDERS
标记为已弃用,并尝试将其移入 @NgModule
,上述解决方案并不适用,因此他们的文档也是如此。我参考了其他答案并找到了在实现基本 URL 方面的方法,希望这对其他人有所帮助。
基本思路是,我们将操作从引导过程中移至 AppModule
中。
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule, RequestOptions } from '@angular/http';
import { CustomRequestOptions } from './customrequest.options';
@NgModule({
declarations: [
AppComponent,
...
],
imports: [
BrowserModule,
HttpModule,
...
],
providers: [
{ provide: RequestOptions, useClass: CustomRequestOptions }
],
bootstrap: [ AppComponent ]
})
将CustomRequestOptions移动到单独的可注入服务中
import { Injectable } from '@angular/core';
import { BaseRequestOptions, RequestOptions, RequestOptionsArgs } from '@angular/http';
@Injectable()
export class CustomRequestOptions extends BaseRequestOptions {
merge(options?:RequestOptionsArgs):RequestOptions {
options.url = 'http://localhost:9080' + options.url;
return super.merge(options);
}
}
针对GET以外的请求方法进行编辑。
如果您正在尝试发送除GET之外的请求类型,则先前的方法无法将baseurl注入到请求中。这是因为Angular2会生成新的RequestOptions
,而不是this._defaultOptions
,其合并方法没有被我们的CustomRequestOptions覆盖。(在此处查看源代码)。
因此,在CustomRequestOptions合并方法的最后一步中,我生成了一个新的CustomRequestOptions
实例,以确保以下操作仍然可以正常工作,而不是返回super.merge(...)
。
import { Injectable } from '@angular/core';
import { RequestOptions, RequestOptionsArgs } from '@angular/http';
@Injectable()
export class CustomRequestOptions extends RequestOptions {
merge(options?: RequestOptionsArgs): RequestOptions {
if (options !== null && options.url !== null) {
options.url = 'http://localhost:9080' + options.url;
}
let requestOptions = super.merge(options)
return new CustomRequestOptions({
method: requestOptions.method,
url: requestOptions.url,
search: requestOptions.search,
headers: requestOptions.headers,
body: requestOptions.body,
withCredentials: requestOptions.withCredentials,
responseType: requestOptions.responseType
});
}
}
这同样适用于POST、PUT、DELETE方法。希望这有所帮助。
constructor(@Inject('BASE_URL') private baseUrl: string) {}
的代码。其中"BASE_URL"是一个标记依赖注入的标识符,该标识符与一个字符串(即URL)相关联,这样就可以在整个应用程序中更轻松地更改URL而不必更改拦截器的代码。 - kmos.w