나는 기본 옵션을 재정의하는 아이디어를 좋아합니다. 이것은 좋은 해결책처럼 보입니다.
그러나 Http
수업 을 확장해야하는 경우 . 이 내용을 반드시 읽어보십시오!
여기에있는 일부 답변은 실제로 request()
메서드 오버로드가 잘못 표시 되어 포착하기 어려운 오류와 이상한 동작을 유발할 수 있습니다. 나는 이것을 스스로 우연히 발견했다.
이 솔루션은 request()
Angular의 메소드 구현을 기반으로 4.2.x
하지만 향후 호환 가능해야합니다.
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';
이름 충돌을 방지하기 위해 원래 클래스를 이런 방식으로 가져 옵니다.
여기서 해결되는 문제는 request()
메소드에 두 가지 다른 호출 서명이 있다는 것입니다. Request
URL 대신 object가 전달 되면 Angular string
에서 options
인수를 무시합니다. 따라서 두 경우 모두 올바르게 처리해야합니다.
그리고이 재정의 된 클래스를 DI 컨테이너에 등록하는 방법의 예는 다음과 같습니다.
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
);
}
이러한 접근 방식으로 주사 할 수 있습니다 Http
클래스를 정상적으로 있지만 재정의 된 클래스는 대신 마법으로 주입됩니다. 이를 통해 응용 프로그램의 다른 부분을 변경하지 않고도 솔루션을 쉽게 통합 할 수 있습니다 (다형성).
모듈 메타 데이터 httpProvider
의 providers
속성에 추가 하십시오.