2017-08-17 212 views
17

我在documentation中找不到方法来为所有http请求设置基本API url。是否可以使用Angular HttpClient?如何为Angular HttpClient设置baseUrl?

+2

您可以创建一个[拦截](https://angular.io/api/common/http/HttpInterceptor),它将用任何你想要的基础来更新url。 –

+0

是不是在这种情况下使用拦截器的开销? –

+0

如果您只想更改它,那可能是。另一个选择是使用一个简单的函数getApiUrl(),它将进行所需的任何转换,如添加基本路径。 –

回答

0

我认为没有默认的方法来做到这一点。做HttpService并在里面你可以定义你的默认URL的属性,并使方法可以用你的属性URL调用http.get和其他方法。然后注入HttpService而不是HttpClient

+0

我做了Http服务,但希望HttpClient有点聪明 –

25

使用新的HttpClient拦截器。

创建实现HttpInterceptor正确的注射:

import {Injectable} from '@angular/core'; 
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http'; 
import {Observable} from 'rxjs/Observable'; 

@Injectable() 
export class APIInterceptor implements HttpInterceptor { 
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 

    const apiReq = req.clone({ url: `your-api-url/${req.url}` }); 
    return next.handle(apiReq); 
    } 
} 

的HttpInterceptor可以克隆该请求,并改变它,你想,在这种情况下,我定义的默认路径为所有的HTTP请求。

提供以下配置HttpClientModule:

providers: [{ 
     provide: HTTP_INTERCEPTORS, 
     useClass: APIInterceptor, 
     multi: true, 
    } 
    ] 

现在,所有的请求都将与your-api-url/

+0

这太棒了!有一件事,你不需要在这里使用Injectable装饰器,只有当你想要将某些东西注入到装饰类中时才需要它。 – BroiSatse

0

开始你并不一定需要一个基本URLHttpClient的中, docs说你只需要指定请求的api部分,如果你打电话给同一台服务器,就像这样简单:

this.http.get('/api/items').subscribe(data => { ...

但是,如果您需要或想要指定基本URL,则可以。

我有这样做2点建议:

。具有静态类属性的助手类。

export class HttpClientHelper{ 

    static baseURL: string = 'http://localhost:8080/myApp'; 
} 


this.http.get(`${HttpClientHelper.baseURL}/api/items`);//in your service class 

。一类属性的基类,所以任何新的业务应该扩展它:

export class BackendBaseService { 

    baseURL: string = 'http://localhost:8080/myApp'; 

    constructor(){} 

}

@Injectable() 
export class ItemsService extends BackendBaseService{ 

    constructor(private http: HttpClient){ 
    super(); 
    } 

    public listAll(): Observable<any>{  
    return this.http.get(`${this.baseURL}/api/items`); 
    } 

} 
相关问题