Axios 知识点总结

Axios 中文文档知识点总结

基于 www.axios-http.cn/ 网站内容整理

1. Axios 概述

1.1 什么是 Axios?

Axios 是一个基于 promise 网络请求库,作用于 node.js 和浏览器中。它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequest。

1.2 主要特性

  • 从浏览器创建 XMLHttpRequest
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 超时处理
  • 查询参数序列化支持嵌套项处理
  • 自动将请求体序列化为:
    • JSON (application/json)
    • Multipart / FormData (multipart/form-data)
    • URL encoded form (application/x-www-form-urlencoded)
  • 将 HTML Form 转换成 JSON 进行请求
  • 自动转换JSON数据
  • 获取浏览器和 node.js 的请求进度,并提供额外的信息(速度、剩余时间)
  • 为 node.js 设置带宽限制
  • 兼容符合规范的 FormData 和 Blob(包括 node.js)
  • 客户端支持防御 XSRF

2. 安装与引入

2.1 安装方式

bash 复制代码
# 使用 npm
$ npm install axios

# 使用 bower
$ bower install axios

# 使用 yarn
$ yarn add axios

# 使用 pnpm
$ pnpm add axios

2.2 CDN 引入

html 复制代码
<!-- 使用 jsDelivr CDN -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

<!-- 使用 unpkg CDN -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

2.3 模块引入

javascript 复制代码
// ES6 导入
import axios from 'axios';

// CommonJS 导入
const axios = require('axios');

// 预构建模块导入
const axios = require('axios/dist/browser/axios.cjs'); // browser
const axios = require('axios/dist/node/axios.cjs'); // node

3. 基础 API 使用

3.1 基本用法

javascript 复制代码
// 基本请求
axios({
  method: 'get',
  url: '/user/12345'
});

// 简化语法
axios('/user/12345');

// Promise 链式调用
axios.get('/user/12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

3.2 请求方法别名

javascript 复制代码
axios.get(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.patch(url[, data[, config]])

3.3 并发请求

javascript 复制代码
function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}

// Promise.all
const [acct, perm] = await Promise.all([getUserAccount(), getUserPermissions()]);

// 或者使用 then
Promise.all([getUserAccount(), getUserPermissions()])
  .then(function ([acct, perm]) {
    // 处理结果
  });

4. Axios 实例

4.1 创建实例

javascript 复制代码
const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

4.2 实例方法

创建的实例拥有与 axios 相同的方法:

javascript 复制代码
instance.request(config)
instance.get(url[, config])
instance.post(url[, data[, config]])
instance.put(url[, data[, config]])
instance.delete(url[, config])
instance.head(url[, config])
instance.options(url[, config])
instance.patch(url[, data[, config]])

5. 请求配置

5.1 完整配置选项

只有 url 是必需的。如果没有指定 method,请求将默认使用 GET 方法。

javascript 复制代码
{
  // `url` 是用于请求的服务器 URL
  url: '/user',

  // `method` 是创建请求时使用的方法
  method: 'get', // 默认值

  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL
  baseURL: 'https://some-domain.com/api/',

  // `transformRequest` 允许在向服务器发送前,修改请求数据
  // 只能用于 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  transformRequest: [function (data, headers) {
    return data;
  }],

  // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
  transformResponse: [function (data) {
    return data;
  }],

  // `headers` 是即将被发送的自定义请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` 是即将与请求一起发送的 URL 参数
  params: {
    ID: 12345
  },

  // `data` 是作为请求主体被发送的数据
  // 只适用于这些请求方法 'PUT', 'POST', 'DELETE 和 'PATCH'
  data: {
    firstName: 'Fred'
  },

  // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  timeout: 1000, // 默认值是 `0` (永不超时)

  // `withCredentials` 表示跨域请求时是否需要使用凭证
  withCredentials: false, // default

  // `auth` 表示应该使用 HTTP 基础验证,并提供凭据
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType` 表示服务器响应的数据类型
  responseType: 'json', // 默认的

  // `responseEncoding` 表示用于解码响应的编码 (Node.js 专属)
  responseEncoding: 'utf8', // default

  // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
  xsrfCookieName: 'XSRF-TOKEN', // default

  // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称
  xsrfHeaderName: 'X-XSRF-TOKEN', // default

  // `onUploadProgress` 允许为上传处理进度事件
  onUploadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `onDownloadProgress` 允许为下载处理进度事件
  onDownloadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `maxContentLength` 定义允许的响应内容的最大尺寸
  maxContentLength: 2000,

  // `maxBodyLength` 定义允许的请求内容的最大尺寸
  maxBodyLength: 2000,

  // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise
  validateStatus: function (status) {
    return status >= 200 && status < 300; // 默认的
  },

  // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
  maxRedirects: 5, // 默认的

  // `socketPath` 定义在 node.js 中使用的UNIX套接字
  socketPath: null, // default

  // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' 定义代理服务器的主机名称和端口
  proxy: {
    protocol: 'https',
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken` 指定用于取消请求的 cancel token
  cancelToken: new CancelToken(function (cancel) {
  }),

  // `decompress` 表示是否应该自动解压响应主体
  decompress: true // 默认的
}

6. 响应结构

6.1 响应对象属性

javascript 复制代码
{
  // `data` 由服务器提供的响应
  data: {},

  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,

  // `statusText` 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',

  // `headers` 服务器响应的头
  headers: {},

  // `config` 是为请求提供的配置信息
  config: {},

  // `request` 是产生此响应的请求
  request: {}
}

6.2 使用 then 时的响应

javascript 复制代码
axios.get('/user/12345')
  .then(function (response) {
    console.log(response.data);
    console.log(response.status);
    console.log(response.statusText);
    console.log(response.headers);
    console.log(response.config);
  });

7. 默认配置

7.1 全局 axios 默认值

可以指定将被用在各个请求的配置默认值。

javascript 复制代码
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';

7.2 自定义实例默认值

javascript 复制代码
// 创建实例时设置配置的默认值
const instance = axios.create({
  baseURL: 'https://api.example.com'
});

// 在实例已创建后修改默认值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

7.3 配置优先顺序

配置会以一个优先顺序进行合并。这个顺序是:

  1. 在 lib/defaults/index.js 找到的库的默认值
  2. 实例的 defaults 属性
  3. 请求的 config 参数

后者将优先于前者。

8. 拦截器

8.1 请求拦截器

在请求或响应被 then 或 catch 处理前拦截它们。

javascript 复制代码
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

8.2 响应拦截器

javascript 复制代码
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数
    // 对响应错误做点什么
    return Promise.reject(error);
  });

8.3 移除拦截器

javascript 复制代码
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

8.4 为自定义 axios 实例添加拦截器

javascript 复制代码
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

8.5 拦截器高级选项

javascript 复制代码
// 同步拦截器
axios.interceptors.request.use(function (config) {
  config.headers.test = 'I am only a header!';
  return config;
}, null, { synchronous: true });

// 条件拦截器
function onGetCall(config) {
  return config.method === 'get';
}

axios.interceptors.request.use(function (config) {
  config.headers.test = 'special get headers';
  return config;
}, null, { runWhen: onGetCall });

9. 错误处理

9.1 基础错误处理

默认情况下,状态码不在 2xx 范围内的响应都会被当作错误处理。

javascript 复制代码
axios.get('/user/12345')
  .catch(function (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);
  });

9.2 自定义错误状态码

javascript 复制代码
axios.get('/user/12345', {
  validateStatus: function (status) {
    return status < 500; // 处理状态码小于500的情况
  }
})

9.3 获取错误详情

javascript 复制代码
axios.get('/user/12345')
  .catch(function (error) {
    console.log(error.toJSON());
  });

10. 取消请求

10.1 使用 AbortController (推荐)

javascript 复制代码
const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});

// 取消请求
controller.abort();

10.2 使用 CancelToken (已弃用)

可以使用 cancel token 取消一个请求。

javascript 复制代码
const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
});

// 取消请求
cancel();

10.3 使用 CancelToken.source 工厂方法

javascript 复制代码
const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // 处理错误
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
});

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

11. 请求体编码

11.1 URL-Encoding Bodies

javascript 复制代码
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);

11.2 Multipart Bodies

javascript 复制代码
const form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));

axios.post('https://httpbin.org/post', form);

11.3 自动序列化

javascript 复制代码
// 自动序列化为 JSON
axios.post('/user', {
  firstName: 'Fred',
  lastName: 'Flintstone'
});

// 字符串格式
axios.post('/user', 'firstName=Fred&lastName=Flintstone');

12. 进度监控

12.1 上传进度

javascript 复制代码
axios.post('/user', formData, {
  onUploadProgress: function (progressEvent) {
    const { loaded, total, progress } = progressEvent;
    console.log(`Upload Progress: ${Math.round(progress * 100)}%`);
  }
});

12.2 下载进度

javascript 复制代码
axios.get('/user', {
  onDownloadProgress: function (progressEvent) {
    const { loaded, total, progress } = progressEvent;
    console.log(`Download Progress: ${Math.round(progress * 100)}%`);
  }
});

13. TypeScript 支持

13.1 类型声明

axios 包括原生支持 TypeScript。

typescript 复制代码
import axios, { AxiosResponse } from 'axios';

interface User {
  id: number;
  name: string;
}

// 泛型支持
const response: AxiosResponse<User> = await axios.get<User>('/user/12345');
console.log(response.data.name);

13.2 自定义配置接口

typescript 复制代码
import axios, { AxiosRequestConfig } from 'axios';

const config: AxiosRequestConfig = {
  url: '/user',
  method: 'get',
  timeout: 1000,
  headers: {
    'Authorization': 'Bearer token'
  }
};

axios(config);

14. 最佳实践

14.1 创建专用实例

javascript 复制代码
// API 实例
const apiClient = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  }
});

14.2 统一错误处理

javascript 复制代码
// 全局错误处理拦截器
axios.interceptors.response.use(
  response => response,
  error => {
    // 统一错误处理
    if (error.response.status === 401) {
      // 重定向到登录页
    }
    return Promise.reject(error);
  }
);

14.3 请求/响应数据转换

javascript 复制代码
// 请求拦截器中添加认证
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

15. 浏览器兼容性

Axios 支持所有现代浏览器,包括:

  • Chrome
  • Firefox
  • Safari
  • Edge
  • Internet Explorer 11

对于较旧的浏览器,可能需要添加 Promise polyfill。

16. 总结

Axios 是一个功能强大且易于使用的 HTTP 客户端库,提供了丰富的配置选项和功能:

  • 简单易用:提供直观的 API 和 Promise 支持
  • 功能丰富:支持拦截器、错误处理、取消请求等高级功能
  • 环境兼容:同构设计,浏览器和 Node.js 环境都支持
  • 类型安全:原生 TypeScript 支持
  • 高度可配置:丰富的配置选项满足各种需求

通过合理使用 Axios 的各种功能,可以构建健壮、高效的 HTTP 请求处理方案。

相关推荐
崔庆才丨静觅28 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅2 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax