Axios 详细用法与参数指南

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境。相比 Fetch API,它提供了更简洁的 API、自动 JSON 转换、请求/响应拦截等强大功能。

安装方式

浏览器中使用 (CDN)

通过 npm/yarn 安装

npm install axios

# 或

yarn add axios

在项目中引入

// ES6 模块

import axios from 'axios';

// CommonJS

const axios = require('axios');

基本用法

发起 GET 请求

axios.get('/user?ID=12345')

.then(response => {

console.log(response.data);

})

.catch(error => {

console.error(error);

});

发起 POST 请求

axios.post('/user', {

firstName: 'Fred',

lastName: 'Flintstone'

})

.then(response => {

console.log(response.data);

})

.catch(error => {

console.error(error);

});

请求配置参数

Axios 请求可以接受一个配置对象,包含以下常用属性:

参数

类型

描述

url

String

请求的服务器 URL

method

String

请求方法,默认是 get

baseURL

String

自动加在 url 前面,除非 url 是绝对 URL

headers

Object

自定义请求头

params

Object

URL 参数,自动拼接到 URL 上

data

Object/FormData/String

作为请求体发送的数据

timeout

Number

请求超时时间(毫秒),默认 0(不超时)

withCredentials

Boolean

跨域请求时是否需要凭证(cookies)

responseType

String

响应数据类型,可选 json/text/blob 等

maxContentLength

Number

允许的响应内容最大尺寸

validateStatus

Function

自定义 HTTP 状态码的验证逻辑

onUploadProgress

Function

上传进度回调

onDownloadProgress

Function

下载进度回调

cancelToken

CancelToken

指定取消请求的 token

完整配置示例

axios({

method: 'post',

url: '/user/12345',

baseURL: 'https://api.example.com',

headers: {

'X-Requested-With': 'XMLHttpRequest',

'Authorization': 'Bearer token123'

},

data: {

firstName: 'Fred',

lastName: 'Flintstone'

},

timeout: 1000,

withCredentials: true,

responseType: 'json',

onUploadProgress: progressEvent => {

const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);

console.log(`上传进度: ${percent}%`);

}

});

响应结构

Axios 请求返回的响应对象包含以下属性:

属性

类型

描述

data

Any

服务器返回的数据

status

Number

HTTP 状态码

statusText

String

HTTP 状态消息

headers

Object

响应头

config

Object

请求的配置信息

request

XMLHttpRequest

生成此响应的请求对象

响应处理示例

axios.get('/user/12345')

.then(response => {

console.log(response.data);

console.log(response.status);

console.log(response.statusText);

console.log(response.headers);

console.log(response.config);

});

全局配置

可以设置全局默认配置,这些配置会应用到每个请求中:

// 设置基础 URL

axios.defaults.baseURL = 'https://api.example.com';

// 设置请求头

axios.defaults.headers.common['Authorization'] = 'Bearer token123';

axios.defaults.headers.post['Content-Type'] = 'application/json';

// 设置超时时间

axios.defaults.timeout = 2500;

创建实例

可以创建自定义的 Axios 实例,每个实例都有自己的配置:

const instance = axios.create({

baseURL: 'https://api.example.com',

timeout: 1000,

headers: {'X-Custom-Header': 'foobar'}

});

// 使用实例

instance.get('/user/12345')

.then(response => {

console.log(response.data);

});

拦截器

Axios 提供了请求和响应拦截器,可以在请求或响应被处理前拦截它们:

请求拦截器

axios.interceptors.request.use(config => {

// 在发送请求前做些什么

config.headers.Authorization = 'Bearer token123';

return config;

}, error => {

// 对请求错误做些什么

return Promise.reject(error);

});

响应拦截器

axios.interceptors.response.use(response => {

// 对响应数据做点什么

if (response.status === 200) {

return response.data;

}

return response;

}, error => {

// 对响应错误做点什么

if (error.response.status === 401) {

// 处理未授权错误

}

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 {

// 处理错误

}

});

// 取消请求

source.cancel('Operation canceled by the user.');

并发请求

Axios 提供了处理并发请求的辅助函数:

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 的错误对象包含以下属性:

属性

类型

描述

message

String

错误消息

config

Object

请求的配置信息

code

String

错误代码(如 'ECONNABORTED')

request

XMLHttpRequest

生成此错误的请求对象

response

Object

包含服务器响应的错误对象

错误处理示例

axios.get('/user/12345')

.catch(error => {

if (error.response) {

// 请求已发出,服务器返回状态码不在 2xx 范围

console.log(error.response.data);

console.log(error.response.status);

console.log(error.response.headers);

} else if (error.request) {

// 请求已发出但没有收到响应

console.log(error.request);

} else {

// 设置请求时出错

console.log('Error', error.message);

}

console.log(error.config);

});

文件上传

Axios 可以方便地上传文件:

const formData = new FormData();

const fileInput = document.querySelector('input[type="file"]');

formData.append('file', fileInput.files[0]);

formData.append('user', 'user123');

axios.post('/upload', formData, {

headers: {

'Content-Type': 'multipart/form-data'

},

onUploadProgress: progressEvent => {

const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);

console.log(`上传进度: ${percent}%`);

}

}).then(response => {

console.log('上传成功', response.data);

});

与 Fetch API 的主要区别

特性

Axios

Fetch

浏览器支持

需要 polyfill 支持 IE11

不支持 IE

请求取消

支持

支持 (AbortController)

超时设置

内置支持

需要手动实现

JSON 转换

自动

需要手动调用 .json()

拦截器

支持

不支持

进度监控

支持

部分支持

并发请求

提供辅助方法

需要手动实现

CSRF 防护

内置支持

需要手动实现

错误处理

更全面

基本

请求/响应转换

支持

不支持

最佳实践

创建实例:为不同的 API 端点创建不同的 Axios 实例

设置全局配置:统一设置 baseURL、超时时间等

使用拦截器:统一处理认证、错误等

封装请求:将常用请求封装成函数

错误处理:统一错误处理逻辑

封装示例

// api.js

import axios from 'axios';

const api = axios.create({

baseURL: 'https://api.example.com',

timeout: 10000

});

// 请求拦截器

api.interceptors.request.use(config => {

const token = localStorage.getItem('token');

if (token) {

config.headers.Authorization = `Bearer ${token}`;

}

return config;

});

// 响应拦截器

api.interceptors.response.use(

response => response.data,

error => {

if (error.response.status === 401) {

// 处理未授权

}

return Promise.reject(error);

}

);

export const getUser = id => api.get(`/users/${id}`);

export const createUser = data => api.post('/users', data);

export const updateUser = (id, data) => api.put(`/users/${id}`, data);

export const deleteUser = id => api.delete(`/users/${id}`);

总结

Axios 是一个功能强大、易于使用的 HTTP 客户端,提供了许多 Fetch API 不具备的高级功能。通过合理配置和使用拦截器、实例等功能,可以大大简化前端网络请求的处理逻辑,提高代码的可维护性和可读性。