Call RESTful APIs | Web Services using Angular and RxJS.
Call and cache data returned from HttpClient
. Caching data will speed up your web/app. Let's understand how!
HttpClient
returned an observable. To cache, we need to combine that observable with shareReplay
and catchError
. We use caching to avoid too many requests to the server.
Let’s dive into the details of HTTP API calls:
1. Without using Caching.
2. With Caching values.
3. With Caching Observable.
Before Calling APIs
You must have APIs, follow this article to create APIs using Node.js and Express.js: Link to Create Rest API👆
1. API calls without using Caching.
Now suppose we have an API endpoint which returns a list of items — each item is a JSON object.
API end-point: localhost:3000/items (Returns list of objects, see image below👇) (To create API follow: Link to Create Rest API👆)
Let’s create a Service for our Items as follows:
We’ll write code in this service file which returns a list of items.
(make sure within your project root directory run below command👇)
ng g service service/items
This command will generate two TypeScript file — look below👇
Next, open the src/app/service/items.service.ts
file and update code:
Using HTTP GET method:
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
@Injectable({
providedIn: "root",
})
export class ItemsService {
// URL which returns list of JSON items (API end-point URL)
private readonly URL = "http://localhost:3000/items";
constructor(private http: HttpClient) {}
// create a method named: resolveItems()
// this method returns list-of-items in form of Observable
// every HTTTP call returns Observable object
resolveItems(): Observable<any> {
console.log("Request is sent!");
// this.http is a HttpClient library provide by @angular/common
// we are calling .get() method over this.http object
// this .get() method takes URL to call API
return this.http.get(this.URL);
}
}
Using HTTP POST method:
import { Injectable } from '[@angular/core](http://twitter.com/angular/core)';
import { HttpClient } from '[@angular/common](http://twitter.com/angular/common)/http';
import { Observable } from 'rxjs';[@Injectable](http://twitter.com/Injectable)({
providedIn: 'root'
})
export class ItemsService {// URL which returns list of JSON items (API end-point URL)
private readonly URL = '<http://localhost:3000/items'>;constructor(private http: HttpClient) { }// create a method named: resolveItems()
// this method returns list-of-items in form of Observable
// every HTTTP call returns Observable object
resolveItems(): Observable<any> {
console.log('Request is sent!');
// Using the POST method
const headers = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded'})
};
return this.http.post(this.URL,
{
'email' : '[ankit.codechintan@gmail.com](mailto:ankit.codechintan@gmail.com)',
'phone' : 910950xxxxx
},
headers)
}
}
Next we will test this API in the Component. For that we will use method we created in items.service.ts
.
Let’s create a Component for our Items as follows:
(make sure within your project root directory run below command)
ng g component items
This command will generate four TypeScript file — look below👇
Important
Do not forget to do Routing of this new ItemsComponent
.
Two steps to do that:
#1. Define your component
route in app-routing.module.ts
file.
#2. Declare your component
in app.module.ts
file.
Let’s do this…
#1. Open up your src/app/app-routing.module.ts
file and update it as follows:
// ...
import { ItemsComponent } from "./items/items.component";
const routes: Routes = [
// ...
{
path: "items",
component: ItemsComponent,
},
];
// ...
#2. Open up your src/app/app.module.ts
file and update it as follows:
// ...
import { ItemsComponent } from './items/items.component';
@NgModule({
declarations: [
AppComponent,
ItemsComponent
],
// ...
})
// ...
Learn more in-depth about ‘Routing of an Angular Component’
(Click here👆)
Finally, open the src/app/items/items.component.ts
file and update it as follows:
import { Component, OnInit, Input } from "@angular/core";
import { Observable } from "rxjs";
import { ItemsService } from "../service/items.service";
@Component({
selector: "app-items",
templateUrl: "./items.component.html",
styleUrls: ["./items.component.scss"],
})
export class ItemsComponent implements OnInit {
@Input()
result$: Observable<any>;
constructor(private itemsService: ItemsService) {
this.result$ = itemsService.resolveItems();
}
ngOnInit() {}
}
Next, open the src/app/items/items.component.html
file and update it as follows:
<pre *ngIf="code"> {{(result$|async)|json}} </pre>
Now, let’s use our ItemsComponent
in the AppComponent
. Open the src/app/app.component.html
file and add this code:
<!-- This tag is a selector of src/app/items/items.component.ts file to be added anywhere in src/app/app.component.html file -->
<app-items></app-items>
Done 🤩
The output of the code is here👇👇 The data is loaded in form of JSON object.
Conclusion
We have seen HTTP API calls with following ways:
- Without using Caching.
- With Caching values.
- With Caching Observable.
Done! 🤩 It’s that simple to Call Rest API/Web services using Angular and RxJS.
See you later 👋👋