Varsayılan seçenekleri geçersiz kılma fikrini seviyorum, bu iyi bir çözüm gibi görünüyor.
Ancak, Httpsınıfı genişletmeye hazırsanız. Bunu mutlaka okuyun!
Burada bazı yanıtlar aslında request()yakalanması zor hatalara ve garip davranışlara neden olabilecek yöntemin yanlış aşırı yüklenmesini gösteriyor . Bunu kendim tökezledim.
Bu çözüm, request()Angular'da yöntem uygulanmasına dayanmaktadır 4.2.x, ancak geleceğe uyumlu olmalıdır:
import {Observable} from 'rxjs/Observable';
import {Injectable} from '@angular/core';
import {
ConnectionBackend, Headers,
Http as NgHttp,
Request,
RequestOptions,
RequestOptionsArgs,
Response,
XHRBackend
} from '@angular/http';
import {AuthenticationStateService} from '../authentication/authentication-state.service';
@Injectable()
export class Http extends NgHttp {
constructor (
backend: ConnectionBackend,
defaultOptions: RequestOptions,
private authenticationStateService: AuthenticationStateService
) {
super(backend, defaultOptions);
}
request (url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
if ('string' === typeof url) {
url = this.rewriteUrl(url);
options = (options || new RequestOptions());
options.headers = this.updateHeaders(options.headers);
return super.request(url, options);
} else if (url instanceof Request) {
const request = url;
request.url = this.rewriteUrl(request.url);
request.headers = this.updateHeaders(request.headers);
return super.request(request);
} else {
throw new Error('First argument must be a url string or Request instance');
}
}
private rewriteUrl (url: string) {
return environment.backendBaseUrl + url;
}
private updateHeaders (headers?: Headers) {
headers = headers || new Headers();
// Authenticating the request.
if (this.authenticationStateService.isAuthenticated() && !headers.has('Authorization')) {
headers.append('Authorization', 'Bearer ' + this.authenticationStateService.getToken());
}
return headers;
}
}
import { Http as NgHttp } from '@angular/http';İsim çakışmalarını önlemek için orijinal sınıfı bu şekilde içe aktardığımı unutmayın .
Burada ele alınan sorun, request()yöntemin iki farklı çağrı imzası olmasıdır. Ne zaman Requestnesne URL yerine geçer string, optionsargüman açısal tarafından göz ardı edilir. Bu nedenle her iki durumda da uygun şekilde ele alınmalıdır.
Ve bu geçersiz kılınan sınıfı DI konteynerine nasıl kaydedeceğinize dair bir örnek:
export const httpProvider = {
provide: NgHttp,
useFactory: httpFactory,
deps: [XHRBackend, RequestOptions, AuthenticationStateService]
};
export function httpFactory (
xhrBackend: XHRBackend,
requestOptions: RequestOptions,
authenticationStateService: AuthenticationStateService
): Http {
return new Http(
xhrBackend,
requestOptions,
authenticationStateService
);
}
Böyle bir yaklaşımla Httpsınıfı normal olarak enjekte edebilirsiniz , ancak geçersiz kılınan sınıfınız sihirli bir şekilde enjekte edilecektir. Bu, uygulamanın diğer kısımlarını değiştirmeden (eylemdeki polimorfizm) çözümünüzü kolayca entegre etmenizi sağlar.
Sadece eklemek httpProvideriçin providerssizin modül meta özelliği.