axios介绍以及配置

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境中进行 HTTP 请求。

一、特点与基本用法

1.特点
  • 浏览器兼容性好:能在多种现代浏览器中使用,包括 Chrome、Firefox、Safari 等。
  • 支持 Promise API:基于 Promise 实现,使得异步操作更易于处理和管理,可方便地进行链式调用和错误处理。
  • 拦截请求和响应:可以在请求发送前和响应接收后进行拦截,对请求和响应进行处理,如添加请求头、验证响应数据等。
  • 取消请求:提供了取消请求的功能,可在特定情况下取消未完成的请求,节省资源。
  • 自动转换 JSON 数据:能自动将响应数据转换为 JSON 格式,方便处理和使用。
特性说明
Promise 支持基于 Promise 的异步请求,支持 async/await,链式调用更直观。
拦截器机制全局/实例级请求和响应拦截器,可统一添加 Token、处理错误日志等。
自动 JSON 转换自动将请求体序列化为 JSON,响应体反序列化为 JSON(可配置 transformRequest/Response)。
取消请求基于 CancelToken(旧版)或 AbortController(新版)取消请求。
并发请求通过 axios.all 和 axios.spread 处理多个并发请求。
浏览器与 Node.js支持浏览器(XHR)和 Node.js(HTTP 模块)环境,通用性强。
2.基本用法

在浏览器环境中,首先要引入 Axios 库,然后就可以使用它来发送各种 HTTP 请求。例如,发送一个 GET 请求获取数据:

axios.get('https://example.com/api/data')
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

发送一个 POST 请求来提交数据:

axios.post('https://example.com/api/create', { name: 'John', age: 30 })
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

还可以通过配置选项来定制请求,如设置请求头、超时时间等:

axios({
  method: 'get',
  url: 'https://example.com/api/data',
  headers: { 'Authorization': 'Bearer token' },
  timeout: 5000
})
.then(response => console.log(response.data))
.catch(error => console.error(error));

二、配置

1.全局配置

可以使用axios.defaults来设置全局默认配置。例如:

axios.defaults.baseURL = 'https://example.com/api';
axios.defaults.headers.common['Authorization'] = 'Bearer token';
axios.defaults.timeout = 5000;

上述代码设置了全局的基础 URL、请求头中的授权信息以及超时时间。

2.实例配置

创建一个 Axios 实例并进行配置:

const instance = axios.create({
  baseURL: 'https://another-example.com/api',
  headers: {
    'Content - Type': 'application/json'
  },
  timeout: 3000
});

这样就创建了一个具有特定配置的 Axios 实例,后续使用该实例发送请求时会应用这些配置。

3.请求配置

在发送请求时也可以直接传入配置参数:

axios.get('https://example.com/api/data', {
  headers: { 'Custom - Header': 'Value' },
  params: { id: 123 }
})
.then(response => console.log(response.data))
.catch(error => console.error(error));

这里为单个 GET 请求设置了自定义请求头和查询参数。

4.拦截器配置

可以使用拦截器在请求发送前或响应接收后进行一些处理:

// 请求拦截器
axios.interceptors.request.use(config => {
  // 在发送请求前做些什么,如添加时间戳
  config.params = { ...config.params, timestamp: Date.now() };
  return config;
}, error => {
  return Promise.reject(error);
});

// 响应拦截器
axios.interceptors.response.use(response => {
  // 对响应数据做些处理,如统一格式化
  response.data = formatResponseData(response.data);
  return response;
}, error => {
  return Promise.reject(error);
});

请求拦截器可以修改请求配置,响应拦截器可以处理响应数据。

三、进阶用法示例

(1)自定义实例与配置
// 创建独立实例(如不同后端服务)
const apiClient = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
  headers: { 'X-Custom-Header': 'value' }
});

// 修改实例默认配置
apiClient.defaults.headers.common['Authorization'] = 'Bearer token';
(2)文件上传与进度监控
const formData = new FormData();
formData.append('file', fileInput.files[0]);

axios.post('/upload', formData, {
  headers: { 'Content-Type': 'multipart/form-data' },
  onUploadProgress: (progressEvent) => {
    const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
    console.log(`上传进度: ${percent}%`);
  }
});
(3)错误统一处理
// 响应拦截器统一处理错误
apiClient.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response) {
      // 服务端返回 4xx/5xx 错误
      console.error(`请求失败:${error.response.status}`, error.response.data);
    } else if (error.request) {
      // 请求已发送但无响应(如超时)
      console.error('请求未收到响应', error.request);
    } else {
      // 请求配置错误
      console.error('请求配置错误', error.message);
    }
    return Promise.reject(error);
  }
);

四、Axios 与其他 HTTP 客户端的对比

1. Axios vs Fetch API
特性AxiosFetch API
语法简洁性链式调用,配置简洁。需手动处理响应和错误(.then().catch())。
JSON 处理自动序列化请求体和反序列化响应体。需手动调用 response.json()
拦截器支持全局和实例级拦截器。需自行封装或使用第三方库。
取消请求支持 CancelToken 或 AbortController。需使用 AbortController。
浏览器兼容性兼容 IE11+(需 polyfill)。兼容现代浏览器,IE 需 polyfill。
请求超时原生支持 timeout 配置。需通过 AbortController + setTimeout 实现。
2. Axios vs jQuery.ajax
特性AxiosjQuery.ajax
依赖项轻量级(无 jQuery 依赖)。依赖 jQuery 库。
Promise 支持原生 Promise。基于 Deferred 对象(需适配 Promise)。
现代特性支持拦截器、取消请求等。功能较基础,扩展性有限。
TypeScript 支持官方提供类型定义。需社区维护的类型定义。
3. Axios vs 其他库(如 ky、SuperAgent)
特性Axiosky(现代轻量库)SuperAgent(老牌库)
体积约 13KB(压缩后)。约 5KB(压缩后)。约 20KB(压缩后)。
Node.js 支持支持。仅浏览器环境(需 ky-universal)。支持。
链式调用支持。支持(如 ky.get().json())。支持(.then() 风格)。
社区活跃度高(GitHub 50k+ Stars)。中等(GitHub 8k+ Stars)。下降趋势(维护较少)。

五、Axios 实践 

1. 统一请求管理

封装请求工具类

class HttpClient {
  constructor(baseURL) {
    this.client = axios.create({ baseURL });
    this._setupInterceptors();
  }

  _setupInterceptors() {
    this.client.interceptors.request.use(this._handleRequest);
    this.client.interceptors.response.use(this._handleResponse, this._handleError);
  }

  _handleRequest(config) {
    config.headers['X-Request-Id'] = uuidv4(); // 添加唯一请求 ID
    return config;
  }

  _handleResponse(response) {
    return response.data; // 直接返回数据,省略响应结构
  }

  _handleError(error) {
    // 统一错误处理逻辑
    throw error;
  }

  get(url, config) { return this.client.get(url, config); }
  post(url, data, config) { return this.client.post(url, data, config); }
  // 其他方法...
}
2. 结合 TypeScript 使用
interface ApiResponse<T> {
  code: number;
  data: T;
  message: string;
}

const fetchUser = async (userId: string): Promise<ApiResponse<User>> => {
  const response = await axios.get<ApiResponse<User>>(`/users/${userId}`);
  return response.data;
};
3. 性能优化
  • 请求缓存
const cache = new Map();

const fetchWithCache = async (url) => {
  if (cache.has(url)) return cache.get(url);
  const response = await axios.get(url);
  cache.set(url, response.data);
  return response.data;
};
  • 并发请求优化
// 使用 Promise.all 并行请求
const [user, posts] = await Promise.all([
  axios.get('/user/1'),
  axios.get('/posts?userId=1')
]);

六、适用场景与总结

1. 推荐使用 Axios 的场景
  • 需要拦截器统一处理日志、鉴权等逻辑。
  • 项目需兼容浏览器和 Node.js 环境。
  • 期望简化 JSON 数据处理和错误处理。
  • 需要取消请求或上传进度监控功能。
2. 不推荐使用 Axios 的场景
  • 极简项目(可直接使用 Fetch API)。
  • 对包体积敏感且无需高级功能(可考虑 ky)。
3.总结

Axios 凭借其丰富的功能、良好的兼容性和强大的社区支持,成为前端开发中最受欢迎的 HTTP 客户端之一。结合 TypeScript 和合理封装,可显著提升代码可维护性和开发效率。对于现代项目,若无需复杂功能,也可考虑轻量替代品(如 ky),但 Axios 仍是大多数场景下的首选。

Axios是一个基于Promise的HTTP库,专为浏览器和Node.js设计,它使得在JavaScript环境中发送HTTP请求变得简单易用。Axios支持浏览器环境下的XMLHttpRequest API,也能够处理JSONP、CORS(跨源资源共享)、本地文件以及浏览器History API请求。 **基本使用步骤:** 1. **安装**: 首先需要通过npm或yarn在项目中安装axios库: ```bash npm install axios # 或者 yarn add axios ``` 2. **导入并创建实例**: 引入axios库,并创建一个axios实例,后续所有的请求都将基于这个实例进行: ```javascript const axios = require('axios'); const instance = axios.create(); ``` 3. **发送GET请求**: ```javascript instance.get('https://api.example.com/data') .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 4. **发送POST请求**: ```javascript instance.post('https://api.example.com/submit', { key: 'value' }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 5. **配置选项**: 可以设置axios实例的一些默认选项,如超时时间、请求头等: ```javascript instance.defaults.timeout = 1000; ``` 6. **取消请求**: 使用`cancelToken`可以取消正在运行的请求: ```javascript const cancelToken = axios.CancelToken.source(); const request = instance.get('/delayed', { cancelToken: cancelToken.token }); // 稍后如果想要取消请求 cancelToken.cancel('Operation cancelled by the user.'); ``` **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值