How to instantiate an Angular HttpClient?
Solution 1:
As previous answers stated, it's better to use dependency injection. That's being said, you can create instance manually like below
const httpClient = new HttpClient(new HttpXhrBackend({
build: () => new XMLHttpRequest()
}));
Solution 2:
You should really use dependency injection, since it's very clean and easy:
constructor(private http: HttpClient) {}
That's how the HttpClient
and all Angular services are intended to be used. Read more about DI here: https://angular.io/guide/dependency-injection.
However, you can technically do it without DI, since it is just a class.
The issue with what you're currently doing with this._Http = new HttpClient(_httpHandler);
is that the HttpClient
requires an instance of an HttpHandler
, but right now it's just getting a variable with no value called _httpHandler
typed as an HttpHandler
. You need to do this:
let _httpHandler = new HttpHandler();
@Injectable()
export class DataService {
constructor() {
this._Http = new HttpClient(_httpHandler);
}
}
That should get it to "work", but again I'd recommend taking another look at dependency injection.
UPDATE:
So as Jota. Toledo pointed out in the comments, you actually cannot instantiate an HttpHandler
as it is an abstract class. See the source code here: https://github.com/angular/angular/blob/5.2.1/packages/common/http/src/backend.ts#L12-L27.
So this just got a lot more complicated.
For @Component
's, there is a way to work with injectors directly that the Angular team explicitly advises against.
In your @Component metadata, provide the service you want to use directly (in the providers array), like so:
@Component({
providers: [HttpClient]
}
export class MyComponent {}
And then you can inject the Injector
using cough Dependency Injection. And access your providers in the constructor like so:
constructor(private injector: Injector) {
this._http = injector.get(HttpClient);
}
Although, I don't think this will work for your use case considering you show an @Injectable
in your question, which doesn't have metadata per se. Second, you're already using dependency injection to get ahold of the Injector
so you might as well just use DI for HttpClient.
It seems you can also still use the deprecated ReflectiveInjector
to do this with an @Injectable
class.
In conclusion, this is a wild goose chase and you should really use dependency injection. It is a fundamental concept in Angular and one of the things that makes the framework so useful. If for some reason you cannot use it, you may want to look at other options besides Angular.