Recipe 4.2
Sending a GET Request With the Fetch API
Fetch is a modern replacement for XMLHttpRequest
.
Unlike XMLHttpRequest
, Fetch works with Promise
s. The initial fetch
call returns a promise that resolves to the response object. To get the JSON response body, we call response.json()
which returns another Promise
. Finally, that gives us the JSON response.
This example sends a GET
request using the Fetch API.
Demo
First name | Last name | Department |
---|---|---|
Loading...
Loading Users
|
Code
JavaScript
function loadUsers() {
// Make the request
return fetch('/api/users')
// Parse the response body as an object
.then(response => response.json())
// Handle errors, including network and JSON parsing errors
.catch(error => console.error('Couldn\'t fetch:', error.message));
}
loadUsers().then(userList => {
console.log('Got users:', userList);
document.querySelector('#loader').remove();
renderUsers(userList);
});
/**
* Renders an array of users in the user table.
* @param userList the array of users
*/
function renderUsers(userList) {
const tableBody = document.querySelector('#users tbody');
userList.forEach(user => {
renderUser(user, tableBody);
});
}
/**
* Renders a user object as a row in the user table.
* @param user the user object to render
* @param tableBody the table body to append the row to
*/
function renderUser(user, tableBody) {
const row = document.createElement('tr');
const firstName = document.createElement('td');
firstName.textContent = user.firstName;
row.appendChild(firstName);
const lastName = document.createElement('td');
lastName.textContent = user.lastName;
row.appendChild(lastName);
const department = document.createElement('td');
department.textContent = user.department;
row.appendChild(department);
tableBody.appendChild(row);
}
HTML
<table id="users" class="table">
<thead>
<tr>
<th class="w-25">First name</th>
<th class="w-25">Last name</th>
<th class="w-25">Department</th>
</tr>
</thead>
<tbody>
<tr id="loader">
<td colspan="3" class="text-center p-4">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div>Loading Users</div>
</td>
</tr>
</tbody>
</table>