GET
requests are the primary method for retrieving data from servers and are used for read-only operations. These requests are perfect for data retrieval without altering server resources, a key pattern in modern web applications.
This guide will show you how to make Axios GET
Requests. Axios is a versatile JavaScript HTTP client that simplifies the process and works consistently in browser and Node.js environments. It is especially useful in Node.js for tasks like web scraping.
In brief:
GET
requests with query parameters and custom headers for more accurate data retrieval. GET
Requests?Axios is a powerful and developer-friendly alternative to the native Fetch API for making HTTP requests in JavaScript. It simplifies GET
requests by automatically parsing JSON, offering better error handling, and a more concise syntax. It also automatically rejects promises on HTTP errors, which makes it easier to manage issues.
Axios offers several key advantages over Fetch:
.json()
as you would with Fetch. The parsed data is available directly in response.data
. Let's compare a simple GET
request using both Axios and Fetch:
1// Axios
2axios.get('https://api.example.com/data')
3 .then(response => console.log(response.data))
4 .catch(error => console.error('Error:', error));
5
6// Fetch
7fetch('https://api.example.com/data')
8 .then(response => response.json())
9 .then(data => console.log(data))
10 .catch(error => console.error('Error:', error));
As shown, Axios requires less boilerplate and is more straightforward.
Axios is widely used in React, Vue, and Angular projects due to its simplicity and ease of integration. Axios is also popular for working with headless CMS platforms like Strapi. For example, you can check out our real estate app guide to see how Axios integrates with Strapi in a practical project.
To get started with Axios GET
requests, follow this simple setup guide.
You can install Axios using npm and yarn, or include it via CDN.
npm install axios
yarn add axios
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
Once installed, you need to import Axios into your JavaScript file:
1import axios from 'axios';
1const axios = require('axios');
To confirm Axios is set up correctly, try a simple test request:
1axios.get('https://jsonplaceholder.typicode.com/posts')
2 .then(response => {
3 console.log('Axios is working:', response.data);
4 })
5 .catch(error => {
6 console.error('Error using Axios:', error);
7 });
If you see the data logged in the console, Axios is successfully installed and ready to use.
Now that Axios is set up, let’s create your first GET
request. We’ll start with the simplest example and then explore how to access and display the response data.
1axios.get('https://api.example.com/data')
This line sends a GET
request to the specified URL.
.then()
method:1axios.get('https://api.example.com/data')
2 .then(response => {
3 console.log(response.data);
4 });
The response
object contains several properties:
data
: The payload returned from the server status
: The HTTP status code statusText
: The HTTP status message headers
: The headers sent by the server config
: The original request configuration 1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Axios GET Request Example</title>
7 <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
8</head>
9<body>
10 <h1>User Data</h1>
11 <div id="user-data"></div>
12
13 <script>
14 // Function to fetch and display user data
15 function fetchUserData() {
16 axios.get('https://jsonplaceholder.typicode.com/users/1')
17 .then(response => {
18 const userData = response.data;
19 const userDiv = document.getElementById('user-data');
20 userDiv.innerHTML = `
21 <h2>${userData.name}</h2>
22 <p>Email: ${userData.email}</p>
23 <p>Phone: ${userData.phone}</p>
24 <p>Website: ${userData.website}</p>
25 `;
26 })
27 .catch(error => {
28 console.error('Error fetching user data:', error);
29 const userDiv = document.getElementById('user-data');
30 userDiv.innerHTML = '<p>Error fetching user data. Please try again later.</p>';
31 });
32 }
33
34 // Call the function when the page loads
35 fetchUserData();
36 </script>
37</body>
38</html>
In this example:
fetchUserData()
that makes a GET
request to the JSONPlaceholder API. .then()
block, we access the response data and update the HTML to display the user information. .catch()
block to handle any errors that might occur during the request. fetchUserData()
function is called when the page loads, triggering the API request.This basic example demonstrates how to make a GET
request with Axios, handle the response, and update the DOM with the fetched data. It also includes simple error handling to improve the user experience in case of network issues or API errors. You could also use this same approach to fetch content from a headless CMS like Strapi 5, which provides a robust REST API for content delivery.
GET
RequestsYou can use query parameters and custom headers to create more efficient, secure, and flexible API interactions. Query parameters reduce unnecessary data transfer, while custom headers help implement robust authentication, versioning, and other custom behaviors in your application.
Query parameters allow you to filter, sort, and paginate data directly from the API, reducing the amount of data transferred and processed by your application. There are two primary methods to add query parameters to your Axios GET
requests:
1axios.get('https://api.example.com/data?id=123&sort=desc')
2 .then(response => console.log(response.data))
3 .catch(error => console.error('Error:', error));
1axios.get('https://api.example.com/data', {
2 params: {
3 id: 123,
4 sort: 'desc'
5 }
6})
7 .then(response => console.log(response.data))
8 .catch(error => console.error('Error:', error));
The params object approach is generally preferred as it offers cleaner code and automatic URL encoding. This is particularly useful when dealing with complex parameters or values that may contain special characters.
Real-world use case: In an e-commerce application, you might use query parameters to fetch products based on category, price range, or search terms:
1axios.get('https://api.example.com/products', {
2 params: {
3 category: 'electronics',
4 minPrice: 100,
5 maxPrice: 500,
6 search: 'smartphone'
7 }
8})
9 .then(response => {
10 // Handle filtered product list
11 })
12 .catch(error => console.error('Error fetching products:', error));
When working with a headless CMS like Strapi v5, query parameters are beneficial for filtering content collections. For example:
1axios.get('https://your-strapi-v5-api.com/api/articles', {
2 params: {
3 'filters[category][$eq]': 'technology',
4 'sort[0]': 'publishedAt:desc',
5 'pagination[page]': 1,
6 'pagination[pageSize]': 10
7 }
8})
9 .then(response => {
10 // Handle filtered articles
11 })
12 .catch(error => console.error('Error fetching articles:', error));
Custom headers allow you to send additional information with your requests, such as authentication tokens, content types, or client-specific data. Here's how to add custom headers to your Axios GET
requests:
1axios.get('/api/data', {
2 headers: {
3 'Authorization': 'Bearer token123',
4 'Accept': 'application/json',
5 'X-Custom-Header': 'SomeValue'
6 }
7})
8 .then(response => console.log(response.data))
9 .catch(error => console.error('Error:', error));
Real-world use cases for custom headers include:
For example, in a SaaS application that uses JWT for authentication:
1const authToken = getAuthTokenFromStorage();
2
3axios.get('https://api.example.com/user/profile', {
4 headers: {
5 'Authorization': `Bearer ${authToken}`,
6 'Accept': 'application/json',
7 'X-Client-Version': '2.1.0'
8 }
9})
10 .then(response => {
11 // Handle user profile data
12 })
13 .catch(error => {
14 if (error.response && error.response.status === 401) {
15 // Handle unauthorized access
16 } else {
17 console.error('Error fetching user profile:', error);
18 }
19 });
GET
RequestsEffective error handling is essential when making GET requests with Axios. It ensures your application remains resilient in the face of errors. Axios provides a detailed error object to help you manage different types of errors. There are three main types of errors you may encounter:
Here’s an example of how to handle these errors using a try/catch block with async/await syntax:
1async function fetchData() {
2 try {
3 const response = await axios.get('https://api.example.com/data');
4 console.log(response.data);
5 } catch (error) {
6 if (error.response) {
7 // Server responded with an error status
8 switch (error.response.status) {
9 case 400:
10 console.log('Bad Request');
11 break;
12 case 401:
13 console.log('Unauthorized');
14 break;
15 case 404:
16 console.log('Not Found');
17 break;
18 default:
19 console.log('Server Error:', error.response.status);
20 }
21 } else if (error.request) {
22 // Request was made but no response received
23 console.log('No response received:', error.request);
24 } else {
25 // Error in setting up the request
26 console.log('Request error:', error.message);
27 }
28 }
29}
This approach allows you to handle specific HTTP status codes, provide appropriate feedback to users, and perform necessary actions (like redirecting to a login page for 401 errors).
For more fine-grained control over which status codes trigger errors, you can use the validateStatus
option:
1axios.get('https://api.example.com/data', {
2 validateStatus: function (status) {
3 return status < 500; // Only treat 500+ status codes as errors
4 }
5});
To implement centralized error handling, you can use Axios interceptors:
1axios.interceptors.response.use(
2 response => response,
3 error => {
4 // Global error handling logic
5 if (error.response && error.response.status === 401) {
6 // Redirect to login page or refresh token
7 }
8 return Promise.reject(error);
9 }
10);
When working with content APIs like those provided by Strapi v5, proper error handling becomes even more critical. For instance, you might need to handle permission errors differently from validation errors:
1try {
2 const response = await axios.get('https://your-strapi-v5-api.com/api/restricted-content');
3 displayContent(response.data);
4} catch (error) {
5 if (error.response) {
6 if (error.response.status === 403) {
7 showPermissionError("You don't have access to this content");
8 } else if (error.response.status === 404) {
9 showNotFoundError("The content you requested doesn't exist");
10 } else {
11 showGenericError("Something went wrong when fetching content");
12 }
13 } else {
14 showConnectionError("Could not connect to the content server");
15 }
16}
GET
RequestsThe async/await syntax simplifies handling asynchronous HTTP requests in JavaScript. It makes working with Axios GET
requests much cleaner and more readable.
Here's how to use async/await with Axios GET
requests:
1async function fetchData() {
2 try {
3 const response = await axios.get('https://api.example.com/data');
4 console.log(response.data);
5 return response.data;
6 } catch (error) {
7 console.error('Error fetching data:', error);
8 throw error;
9 }
10}
The await
keyword pauses the function's execution until the promise is resolved, making the code read more like synchronous code while maintaining its asynchronous behavior. This approach eliminates the need for promise chains with .then()
and .catch()
, resulting in more readable and maintainable code.
Error handling with async/await is also more intuitive. You can use familiar try/catch blocks to handle errors, making your code easier to understand and debug.
Async/await really shines when handling multiple sequential requests. Instead of dealing with nested promise chains, you can write code that's easier to follow:
1async function getUserWithPosts(userId) {
2 try {
3 const userResponse = await axios.get(`https://api.example.com/users/${userId}`);
4 const user = userResponse.data;
5
6 const postsResponse = await axios.get(`https://api.example.com/users/${userId}/posts`);
7 const posts = postsResponse.data;
8
9 return {
10 user,
11 posts
12 };
13 } catch (error) {
14 console.error('Error fetching user data:', error);
15 throw error;
16 }
17}
When fetching content from a headless CMS like Strapi v5, async/await makes complex data fetching operations more manageable:
1async function fetchBlogWithRelatedContent() {
2 try {
3 // Fetch the main blog post
4 const blogResponse = await axios.get('https://your-strapi-v5-api.com/api/blogs/1?populate=author,category');
5 const blog = blogResponse.data;
6
7 // Use information from the blog to fetch related content
8 const categoryId = blog.data.attributes.category.data.id;
9
10 // Fetch related posts in the same category
11 const relatedResponse = await axios.get(`https://your-strapi-v5-api.com/api/blogs`, {
12 params: {
13 'filters[category][id][$eq]': categoryId,
14 'filters[id][$ne]': blog.data.id, // Exclude current blog
15 'pagination[limit]': 3
16 }
17 });
18
19 return {
20 currentBlog: blog.data,
21 relatedBlogs: relatedResponse.data.data
22 };
23 } catch (error) {
24 console.error('Error fetching blog content:', error);
25 throw error;
26 }
27}
Remember that async functions always return a promise, so you can still use .then()
and .catch()
when calling them:
1getUserWithPosts(123)
2 .then(data => {
3 console.log(data.user);
4 console.log(data.posts);
5 })
6 .catch(error => {
7 console.error('Failed to get user with posts:', error);
8 });
GET
Requests with AxiosIn modern web development, you often need to fetch data from multiple endpoints simultaneously. Axios provides powerful tools to handle concurrent GET
requests efficiently.
The axios.all()
method allows you to execute multiple GET
requests concurrently. It takes an array of promises and returns a single promise that resolves when all requests are complete:
1import axios from 'axios';
2
3const endpoints = [
4 'https://api.github.com/users/username',
5 'https://api.github.com/users/username/repos',
6 'https://api.github.com/users/username/followers'
7];
8
9axios.all(endpoints.map(endpoint => axios.get(endpoint)))
10 .then(responses => {
11 console.log(responses); // Array of response objects
12 })
13 .catch(error => {
14 console.error(error);
15 });
This approach is useful when you need to fetch related data from different endpoints.
To make response handling more readable, especially when dealing with multiple requests, you can use axios.spread()
:
1const getUserInfo = () => {
2 const userRequest = axios.get('https://api.github.com/users/username');
3 const reposRequest = axios.get('https://api.github.com/users/username/repos');
4 const followersRequest = axios.get('https://api.github.com/users/username/followers');
5
6 axios.all([userRequest, reposRequest, followersRequest])
7 .then(axios.spread((userResponse, reposResponse, followersResponse) => {
8 console.log('User data:', userResponse.data);
9 console.log('Repos data:', reposResponse.data);
10 console.log('Followers data:', followersResponse.data);
11 }))
12 .catch(error => {
13 console.error(error);
14 });
15};
This method simplifies response handling and improves readability.
You can use async/await with Promise for even more readable asynchronous code.all()
:
1async function fetchData() {
2 try {
3 const endpoints = [
4 'https://api.example.com/users',
5 'https://api.example.com/products',
6 'https://api.example.com/orders'
7 ];
8
9 const requests = endpoints.map(endpoint => axios.get(endpoint));
10 const responses = await Promise.all(requests);
11
12 const [users, products, orders] = responses.map(response => response.data);
13
14 return { users, products, orders };
15 } catch (error) {
16 console.error('Error fetching data:', error);
17 throw error;
18 }
19}
This approach allows you to manage multiple concurrent requests with cleaner, more readable code.
When working with content management systems like Strapi v5, you might need to fetch different content types simultaneously:
1async function fetchHomepageContent() {
2 try {
3 const strapiBaseUrl = 'https://your-strapi-v5-api.com/api';
4
5 // Define all the requests we need for our homepage
6 const requests = [
7 axios.get(`${strapiBaseUrl}/hero-section?populate=*`),
8 axios.get(`${strapiBaseUrl}/featured-products?populate=images`),
9 axios.get(`${strapiBaseUrl}/testimonials?pagination[limit]=3`),
10 axios.get(`${strapiBaseUrl}/blog-posts?pagination[limit]=4&sort=publishedAt:desc`)
11 ];
12
13 // Execute all requests in parallel
14 const [heroData, productsData, testimonialsData, blogData] = await Promise.all(requests);
15
16 // Transform and return the data
17 return {
18 hero: heroData.data.data.attributes,
19 featuredProducts: productsData.data.data,
20 testimonials: testimonialsData.data.data,
21 latestBlogPosts: blogData.data.data
22 };
23 } catch (error) {
24 console.error('Failed to fetch homepage content:', error);
25 throw error;
26 }
27}
You can follow these practices and adopt Axios's features for concurrent GET
requests to build robust and efficient data fetching logic in your web applications.
Whether you're building a dashboard that needs to display various types of content from Strapi v5 or a complex form that requires information from multiple endpoints, mastering simultaneous GET
requests with Axios will significantly enhance your development workflow.
Mastering GET
requests with Axios offers a world of possibilities for building robust, data-driven applications. In this guide, you’ve learned how to set up Axios, make basic and advanced requests, handle errors effectively, and use modern JavaScript patterns like async/await for cleaner code. You’ve also seen how Axios works seamlessly with headless CMS platforms like Strapi 5 to fetch and manage content efficiently.
By implementing the techniques in this guide, you’ll create more maintainable and error-resistant code that communicates with backend services. Good API integration goes beyond just making requests—it’s about handling responses smoothly, managing errors intelligently, and structuring your code for readability and maintainability.
Whether building a marketing site with Strapi or a food ordering app with Strapi, mastering Axios will streamline your development process and enhance your app’s performance.