আমি ডিফল্ট বিকল্পগুলিকে ওভাররাইড করার ধারণাটি পছন্দ করি, এটি একটি ভাল সমাধান বলে মনে হচ্ছে।
তবে, আপনি যদি প্রসারিত করতে চান Http
ক্লাস । এটি মাধ্যমে নিশ্চিত করুন!
কিছু উত্তর এখানে প্রকৃতপক্ষে ভুল ওভারলোডিং দেখাচ্ছে request()
পদ্ধতির , যা ধরা পড়ার জন্য ত্রুটি এবং অদ্ভুত আচরণের কারণ হতে পারে। আমি নিজেই হোঁচট খেয়েছি।
এই সমাধানটি request()
কৌণিক পদ্ধতিতে প্রয়োগের উপর ভিত্তি করে 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 এর পরিবর্তে পাস করা হয়েছে string
, options
যুক্তি কৌণিক দ্বারা উপেক্ষা করা হয়। সুতরাং উভয় কেস সঠিকভাবে পরিচালনা করতে হবে।
এবং ডিআই কনটেইনার দিয়ে এই ওভাররাইড ক্লাসটি কীভাবে নিবন্ধিত করবেন তার উদাহরণ এখানে:
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
সাধারণত ক্লাসটি তবে আপনার ওভাররাইড হওয়া ক্লাসটি পরিবর্তে যাদুতে ইনজেকশন দেওয়া হবে। এটি আপনাকে অ্যাপ্লিকেশনের অন্যান্য অংশগুলি (ক্রিয়ায় পলিমারফিজম) পরিবর্তন না করে সহজেই আপনার সমাধানকে সংহত করতে দেয় allows
শুধু যোগ httpProvider
করতে providers
আপনার মডিউল মেটাডেটার সম্পত্তি।