React/ReactJS: HTTP Requests using Fetch API
and axios
In this tutorial, we will learn how to make simple HTTP requests or API calls in React with examples.
In the first section, we will be using the browser's in-built Fetch API to request external data asynchronously.
Fetch API is Promise-based and has the fetch()
method which is defined on the window
object. Fetch is supported in the latest versions of Chrome, Firefox, Safari and Opera. However, it is not supported in IE 11. To make it work there, you have to include some polyfills like isomorphic-fetch.
But a little reminder before we start. In React, AJAX calls should be made inside the componentDidMount()
lifecycle method and not inside the about-to-be-deprecated componentWillMount()
. The differences between the two have been covered here.
Fetching Data with Fetch API
And so we fetch the data inside componentDidMount()
from an external source, the free online REST API for fake data: https://jsonplaceholder.typicode.com/users. The code inside componentDidMount()
is plain JavaScript, except for the assigning setState()
method.
class Users extends React.Component{
constructor(props) {
super(props);
this.state = {
users: []
}
}
componentDidMount() {
fetch('https://jsonplaceholder.typicode.com/users')
.then(response => response.json())
.then(users => this.setState({ users }));
}
render() {
return (
<div>
<ul>
{
this.state.users.map(usr =>
<li key={usr.id}>{usr.name}</li>
)
}
</ul>
</div>
);
}
}
export default Users;
Fetching Data wth Axios
In this section, we explore another Promise-based HTTP client called axios
that works in both the browser and the Node.js environment. The advantage (compared to the fetch()
method above) is that, unlike the Fetch API, axios
works well in IE11. You can check for the supported browsers here.
Install the package using npm
.
npm install axios --save
Import it into the component where you intend to make the HTTP request.
import axios from 'axios';
As recommended in React, we make the request inside componentDidMount()
.
class Users extends React.Component{
constructor(props) {
super(props);
this.state = {
users: []
}
}
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/users')
.then(response => response.data)
.then(users => this.setState({ users }))
}
render() {
return (
<div>
<ul>
{
this.state.users.map(usr =>
<li key={usr.id}>{usr.name}</li>
)
}
</ul>
</div>
);
}
}
export default Users;
The data
(the JSON data we are looking for) comes as a property in the response object along with other properties like config
, headers
, request
, status
and statusText
. That is why, unlike in the fetch()
method above, we use response.data
while making the assignment in setState()
.
It is always a good practice to attach the catch()
handler.
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/users')
.then(response => response.data)
.then(users => this.setState({ users }))
.catch(err => console.log(err))
}