Axios是一个基于Promise的HTTP客户端,用于浏览器和node.js环境。它已经成为现代前端开发中最流行的HTTP请求库之一,因其简洁的API和强大的功能而广受开发者喜爱。本文将全面介绍Axios的核心特性和使用方法。
Axios是一个基于Promise的HTTP库,可以用在浏览器和node.js中。它具有以下主要特点:
可以通过多种方式安装Axios:
npm install axios
yarn add axios
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
// 最简单的GET请求
axios.get('/user?ID=12345')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.log(error);
});
// 带参数的GET请求
axios.get('/user', {
params: {
ID: 12345
}
})
.then(response => {
console.log(response);
})
.catch(error => {
console.log(error);
});
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(response => {
console.log(response);
})
.catch(error => {
console.log(error);
});
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread((acct, perms) => {
// 两个请求都完成后执行
console.log(acct.data, perms.data);
}));
可以创建自定义配置的Axios实例:
const instance = axios.create({
baseURL: 'https://api.example.com',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
// 使用实例
instance.get('/users')
.then(response => {
console.log(response.data);
});
可以设置全局的Axios默认值:
// 设置全局baseURL
axios.defaults.baseURL = 'https://api.example.com';
// 设置请求头
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
Axios提供了请求和响应拦截器:
// 添加请求拦截器
axios.interceptors.request.use(config => {
// 在发送请求前做些什么
config.headers.Authorization = 'Bearer token';
return config;
}, error => {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(response => {
// 对响应数据做点什么
return response.data; // 通常我们只需要response.data
}, error => {
// 对响应错误做点什么
return Promise.reject(error);
});
Axios支持取消请求的功能:
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(thrown => {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 处理错误
}
});
// 取消请求(message参数是可选的)
source.cancel('Operation canceled by the user.');
Axios提供了完善的TypeScript支持:
interface User {
id: number;
name: string;
email: string;
}
// 获取用户数据
axios.get<User>('/user/1')
.then(response => {
console.log(response.data.name); // 类型安全
});
// 创建用户
axios.post<User>('/users', {name: 'John', email: '[email protected]'})
.then(response => {
console.log(response.data.id);
});
在实际项目中,建议对Axios进行封装:
// api.js
import axios from 'axios';
const api = axios.create({
baseURL: process.env.REACT_APP_API_BASE_URL,
timeout: 10000,
});
// 请求拦截器
api.interceptors.request.use(
config => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
error => Promise.reject(error)
);
// 响应拦截器
api.interceptors.response.use(
response => response.data,
error => {
if (error.response.status === 401) {
// 处理未授权
window.location.href = '/login';
}
return Promise.reject(error);
}
);
export default api;
统一的错误处理机制:
// 封装请求函数
async function request(url, method = 'get', data = null) {
try {
const response = await axios({
method,
url,
data
});
return response.data;
} catch (error) {
if (error.response) {
// 请求已发出,服务器返回状态码不在2xx范围内
console.error('Error response:', error.response.data);
console.error('Status:', error.response.status);
console.error('Headers:', error.response.headers);
} else if (error.request) {
// 请求已发出,但没有收到响应
console.error('Error request:', error.request);
} else {
// 发送请求时发生了一些事情
console.error('Error message:', error.message);
}
throw error;
}
}
使用async/await可以更清晰地处理异步请求:
async function fetchData() {
try {
const [usersResponse, postsResponse] = await Promise.all([
axios.get('/users'),
axios.get('/posts')
]);
console.log('Users:', usersResponse.data);
console.log('Posts:', postsResponse.data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
前端开发中经常会遇到跨域问题,可以通过以下方式解决:
对于CSRF防护,Axios提供了内置支持:
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';
使用Axios上传文件:
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('name', 'my file');
axios.post('/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
Axios作为现代前端开发中最流行的HTTP客户端之一,提供了简洁而强大的API。通过本文的学习,你应该已经掌握了:
在实际开发中,合理使用Axios可以大大提高开发效率,同时保持代码的整洁和可维护性。建议根据项目需求对Axios进行适当封装,建立统一的请求处理机制。