🚀 Boost Your Axios Skills: Master API Requests Like a Pro! 🌐✨

Atiq ur rehman
3 min readDec 20, 2024

--

Making HTTP requests with Axios

Axios, a popular HTTP client library, simplifies API calls in JavaScript applications, especially in React. While its basic usage is straightforward, modern techniques can significantly enhance its capabilities, particularly for scalability, maintainability, and performance.

Setting Up Axios in ReactJS

To start using Axios, install it in your React project:

npm install axios

Here’s a simple example to fetch data:

import axios from 'axios';
import { useEffect, useState } from 'react';
function App() {
const [data, setData] = useState(null);
useEffect(() => {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => setData(response.data))
.catch(error => console.error(error));
}, []);
return (
<div>
{data ? data.map(item => <p key={item.id}>{item.title}</p>) : 'Loading…'}
</div>
);
}
export default App;

Modern Enhancements

Let’s explore advanced Axios techniques to modernize your React applications.

1. Axios Instances

Create reusable Axios instances to manage base URLs and default headers:

import axios from 'axios';
const apiClient = axios.create({
baseURL: 'https://api.example.com',
timeout: 1000,
headers: { 'Authorization': 'Bearer your-token' }
});
export default apiClient;
Usage:
import apiClient from './apiClient';
apiClient.get('/users')
.then(response => console.log(response.data));

2. Interceptors for Request and Response

Interceptors let you handle requests and responses globally:

apiClient.interceptors.request.use(config => {
// Add auth token to headers dynamically
config.headers['Authorization'] = `Bearer ${localStorage.getItem('token')}`;
return config;
}, error => {
return Promise.reject(error);
});
apiClient.interceptors.response.use(response => {
return response;
}, error => {
if (error.response.status === 401) {
// Handle unauthorized access
console.error('Unauthorized');
}
return Promise.reject(error);
});

3. Custom Hooks with Axios

Encapsulate Axios logic into reusable hooks:

import { useState, useEffect } from 'react';
import apiClient from './apiClient';
function useFetch(url) {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
apiClient.get(url)
.then(response => setData(response.data))
.catch(error => setError(error))
.finally(() => setLoading(false));
}, [url]);
return { data, error, loading };
}
export default useFetch;
Usage:
function Users() {
const { data, error, loading } = useFetch('/users');
if (loading) return <p>Loading…</p>;
if (error) return <p>Error: {error.message}</p>;
return (
<ul>
{data.map(user => <li key={user.id}>{user.name}</li>)}
</ul>
);
}

4. Handling Cancellations

Prevent memory leaks by cancelling Axios requests when a component unmounts:

import { useEffect, useState } from 'react';
import axios from 'axios';
function App() {
const [data, setData] = useState(null);
useEffect(() => {
const source = axios.CancelToken.source();
axios.get('https://jsonplaceholder.typicode.com/posts', {
cancelToken: source.token
})
.then(response => setData(response.data))
.catch(error => {
if (axios.isCancel(error)) {
console.log('Request canceled:', error.message);
} else {
console.error(error);
}
});
return () => source.cancel('Component unmounted');
}, []);
return (
<div>
{data ? data.map(item => <p key={item.id}>{item.title}</p>) : 'Loading…'}
</div>
);
}
export default App;

5. Error Handling with Context Providers

Centralize error handling using React Context:

import { createContext, useContext, useState } from 'react';
const ErrorContext = createContext();
export function ErrorProvider({ children }) {
const [error, setError] = useState(null);
return (
<ErrorContext.Provider value={{ error, setError }}>
{children}
{error && <div className="error">{error}</div>}
</ErrorContext.Provider>
);
}
export function useError() {
return useContext(ErrorContext);
}

Usage:

import apiClient from './apiClient';
import { useError } from './ErrorProvider';
function App() {
const { setError } = useError();
useEffect(() => {
apiClient.get('/data')
.catch(err => setError(err.message));
}, [setError]);
return <div>Check the error context!</div>;
}

Conclusion

By leveraging modern Axios techniques such as interceptors, custom hooks, cancellation, and context-based error handling, you can create more robust and maintainable React applications. Try integrating these patterns into your projects to experience the benefits firsthand!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Atiq ur rehman
Atiq ur rehman

No responses yet

Write a response