Axios
Axios cheat sheet covering HTTP requests, interceptors, error handling, request cancellation, and TypeScript configuration examples.
New to Async JavaScript? Start Here First!
This sheet covers the Fetch API for making HTTP requests. If you're new to promises, async/await, or asynchronous JavaScript patterns, we recommend starting with our async JavaScript fundamentals sheet first.
Start with Async JavaScript FundamentalsOther JavaScript Sheets
Installation & Basic Requests
Install Axios and create your first request
# Install via npm
npm install axios
# Install via yarn
yarn add axios
# Install via pnpm
pnpm add axiosPerform GET, POST, PUT, PATCH, and DELETE requests
// GET request
const users = await axios.get('/api/users');
// POST request with data
const newUser = await axios.post('/api/users', {
name: 'John Doe',
email: 'john@example.com'
});
// PUT request (full update)
const updated = await axios.put('/api/users/1', {
name: 'Jane Doe',
email: 'jane@example.com'
});
// PATCH request (partial update)
const patched = await axios.patch('/api/users/1', {
email: 'newemail@example.com'
});
// DELETE request
await axios.delete('/api/users/1');Configure timeout, headers, query params, and more
// Basic config options
const response = await axios.get('/api/users', {
params: { page: 1, limit: 10 },
timeout: 5000,
headers: {
'Authorization': 'Bearer token123',
'Custom-Header': 'value'
}
});
// Base URL and default config
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
headers: { 'X-Custom-Header': 'value' }
});
// Use custom instance
const users = await api.get('/users');Interceptors & Error Handling
Modify requests before they are sent
// Add request interceptor
axios.interceptors.request.use(
(config) => {
// Modify config before request is sent
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = \`Bearer \${token}\`;
}
console.log('Request:', config.method, config.url);
return config;
},
(error) => {
// Handle request error
return Promise.reject(error);
}
);Transform responses and handle errors globally
// Add response interceptor
axios.interceptors.response.use(
(response) => {
// Transform successful response
console.log('Response:', response.status);
return response.data; // Return only data
},
(error) => {
// Handle error globally
if (error.response?.status === 401) {
// Redirect to login
window.location.href = '/login';
}
return Promise.reject(error);
}
);Handle and diagnose different error types
// Comprehensive error handling
try {
const response = await axios.get('/api/data');
console.log(response.data);
} catch (error) {
if (axios.isAxiosError(error)) {
if (error.response) {
// Server responded with error status
console.log('Data:', error.response.data);
console.log('Status:', error.response.status);
console.log('Headers:', error.response.headers);
} else if (error.request) {
// Request made but no response
console.log('No response:', error.request);
} else {
// Request setup error
console.log('Error:', error.message);
}
} else {
console.log('Non-Axios error:', error);
}
}Request Cancellation & Timeout
Cancel in-flight requests using modern AbortController API
// Cancel a request
const controller = new AbortController();
axios.get('/api/users', {
signal: controller.signal
}).catch(error => {
if (axios.isCancel(error)) {
console.log('Request cancelled:', error.message);
}
});
// Cancel the request
controller.abort();Set connection and response timeouts to prevent hanging
// Request timeout (5 seconds)
const response = await axios.get('/api/data', {
timeout: 5000
});
// Different timeouts per instance
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000 // 10 seconds default
});
// Override instance timeout
const quick = await api.get('/fast', { timeout: 2000 });
const slow = await api.get('/slow', { timeout: 30000 });Advanced Patterns
Type-safe API calls with TypeScript generics
// Define response types
interface User {
id: number;
name: string;
email: string;
}
interface ApiResponse<T> {
data: T;
message: string;
status: number;
}
// Type-safe request
const response = await axios.get<User[]>('/api/users');
const users: User[] = response.data;
// Custom API client
const api = axios.create({
baseURL: 'https://api.example.com'
});
async function getUsers(): Promise<User[]> {
const { data } = await api.get<User[]>('/users');
return data;
}Handle file uploads with progress and file downloads
// File upload
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('name', 'Document');
const response = await axios.post('/api/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress: (progressEvent) => {
const percent = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
console.log(\`Upload: \${percent}%\`);
}
});Implement JWT refresh, bearer tokens, and auth interceptors
// Bearer token authentication
const api = axios.create({
baseURL: 'https://api.example.com'
});
api.interceptors.request.use((config) => {
const token = localStorage.getItem('accessToken');
if (token) {
config.headers.Authorization = \`Bearer \${token}\`;
}
return config;
});
// Token refresh on 401
api.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
const refreshToken = localStorage.getItem('refreshToken');
const { data } = await axios.post('/auth/refresh', {
refreshToken
});
localStorage.setItem('accessToken', data.accessToken);
originalRequest.headers.Authorization = \`Bearer \${data.accessToken}\`;
return api(originalRequest);
}
return Promise.reject(error);
}
);