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
Sign in to mark items as known and track your progress.
Sign inInstallation & Basic Requests
Installation & Setup
Install Axios and create your first request
# Install via npm
npm install axios
# Install via yarn
yarn add axios
# Install via pnpm
pnpm add axiosHTTP Request Methods
Perform 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');Request Configuration
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
Request Interceptors
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);
}
);Response Interceptors
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);
}
);Error Handling
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
Request Cancellation with AbortController
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();Timeout Configuration
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
TypeScript Integration
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;
}File Uploads & Downloads
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}%\`);
}
});Authentication Patterns
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);
}
);