// main.ts import { bootstrapApplication } from '@angular/platform-browser'; import { provideHttpClient } from '@angular/common/http'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, { providers: [provideHttpClient()], }); // user.service.ts import { Injectable, inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; export interface User { id: number; name: string; } @Injectable({ providedIn: 'root' }) export class UserService { private http = inject(HttpClient); getUsers(): Observable { return this.http.get('https://jsonplaceholder.typicode.com/users'); } } // user-list.component.ts import { Component, inject, OnInit } from '@angular/core'; import { UserService, User } from './user.service'; @Component({ selector: 'app-user-list', standalone: true, template: ` `, }) export class UserListComponent implements OnInit { private userService = inject(UserService); users: User[] = []; ngOnInit() { this.userService.getUsers().subscribe((users) => { this.users = users; }); } } /* Notes: - provideHttpClient() registers the HTTP client once, app-wide. - The service only RETURNS the Observable; nothing happens until the component subscribes to it in ngOnInit. - http.get gives the response full TypeScript typing, so `users` is known to be User[] throughout. */