2017-08-17 32 views
17

Nie znalazłem sposobu w documentation, aby ustawić adres URL podstawowego interfejsu API dla wszystkich żądań http. Czy można to zrobić z Angular HttpClient?Jak ustawić baseUrl dla Angular HttpClient?

+2

Można utworzyć [przechwytywania] (https://angular.io/api/common/http/HttpInterceptor), który zaktualizuje adres URL z dowolną bazą. –

+0

czy nie jest to konieczne, aby użyć przechwytywaczy w tym przypadku? –

+0

Jeśli chcesz zmienić tylko to tak, być może. Inną opcją jest posiadanie prostej funkcji getApiUrl(), która będzie wymagać wszelkich transformacji, takich jak dodanie ścieżki bazowej. –

Odpowiedz

0

Myślę, że nie ma domyślnego sposobu, aby to zrobić. Wykonaj HttpService, a wewnątrz możesz zdefiniować właściwość domyślnego adresu URL i utwórz metody wywoływania http.get i innych za pomocą adresu URL właściwości. Następnie wprowadź HttpService zamiast HttpClient

+0

Zrobiłem to dla usługi Http, ale miał nadzieję, że HttpClient jest nieco mądrzejszy –

25

Użyj nowego HttpClient Interceptor.

Tworzenie właściwego wstrzykiwania, która implementuje 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 można sklonować żądanie i zmienić go jak chcesz, w tym przypadku zdefiniowany domyślną ścieżkę dla wszystkich żądań HTTP.

Podaj HttpClientModule z następujących konfiguracjach:

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

Teraz wszystkie wasze prośby rozpocznie z your-api-url/

+0

To jest świetne! Jedną rzeczą jest to, że nie musisz używać tutaj dekoratora do wstrzykiwania, jest on wymagany tylko wtedy, gdy chcesz wstrzyknąć coś do dekorowanej klasy. – BroiSatse

0

nie koniecznie URL bazową z HttpClient The Dokumenty mówią, że musisz tylko określić część API żądania, jeśli dzwonisz do tego samego serwera, jest to proste:

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

Możesz jednak, jeśli chcesz lub chcesz, podać podstawowy adres URL.

mam 2 propozycje to robić:

. Klasa pomocnicza ze statyczną właściwością klasy.

export class HttpClientHelper{ 

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


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

. Klasy podstawowej z właściwości klasy więc każda nowa usługa powinna go przedłużyć:

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`); 
    } 

}