下面是一个简单的 TypeScript 版本的封装 Axios 请求例子基于 Axios 0.21.1 版本

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

// 定义通用响应结构
export interface ApiResponse<T> {
  code: number;
  data: T;
  message: string;
}

// 创建一个 Axios 实例
const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
});

// 定义请求拦截器
axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
  // 在发送请求之前做些什么比如添加 token 头部
  return config;
}, (error: any) => {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 定义响应拦截器
axiosInstance.interceptors.response.use((response: AxiosResponse) => {
  // 对响应数据做些什么,比如处理通用响应结构返回 data 部分
  const apiResponse: ApiResponse<any> = response.data;
  return apiResponse.data;
}, (error: any) => {
  // 对响应错误做些什么
  return Promise.reject(error);
});

// 封装 GET 请求
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  return axiosInstance.get<T>(url, { params, ...config });
}

// 封装 POST 请求
export function post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  return axiosInstance.post<T>(url, data, config);
}

// 封装 PUT 请求
export function put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  return axiosInstance.put<T>(url, data, config);
}

// 封装 DELETE 请求
export function del<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
  return axiosInstance.delete<T>(url, config);
}

在这个示例中,我们首先定义一个通用的响应结构 ApiResponse,用来包装 API 返回数据,包括状态码、数据消息信息然后我们创建一个 Axios 实例定义了请求和响应拦截器,以及封装了 GET、POST、PUT 和 DELETE 请求的函数每个函数使用了 Axios 实例发送请求,并处理了响应的通用结构最后返回数据部分

使用这些封装的函数可以方便地发送请求,并处理通用响应结构。比如我们可以这样使用

import { get, post } from './api';

// 发送 GET 请求
get<User[]>('/users').then(users => {
  console.log(users);
});

// 发送 POST 请求
post<User>('/users', { name: 'Alice', age: 18 }).then(user => {
  console.log(user);
});

其中,我们可以在函数指定返回数据类型例如 <User[]> 表示返回一个 User 类型数组,或者 表示返回一个 User 类型对象

如何在封装的 Axios 请求中添加一些常用的功能

添加请求超时功能

网络请求中,经常会遇到请求超时的情况,为了提高用户体验,我们可以添加请求超时的功能,当请求超过一定时间仍未返回时,自动取消请求并抛出异常。这可以通过设置 timeout 参数实现,例如:

// 封装 GET 请求,并设置超时时间为 10 秒
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  return axiosInstance.get<T>(url, { params, ...config, timeout: 10000 });
}

在这个示例中,我们为 GET 请求添加了一个超时时间为 10 秒的选项。当请求超过 10 秒仍未返回时,Axios 会自动取消请求,并抛出一个 Error 异常。我们可以在调用捕获这个异常以便进行错误处理

添加请求重试功能

时候,在网络不稳定的情况下,请求可能失败,为了提高请求的成功率,我们可以添加请求重试的功能,即在请求失败时,自动重试一定次数,直到请求成功或达到最大重试次数为止。这可以通过设置 retryretryDelay 参数实现,例如:

// 封装 GET 请求,并添加请求重试功能
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  const defaultConfig = { params, ...config };
  return axiosInstance.get<T>(url, {
    ...defaultConfig,
    retry: 3, // 最多重试 3 次
    retryDelay: 1000, // 每次重试间隔 1 秒
  });
}

在这个示例中,我们为 GET 请求添加了一个最多重试 3 次的选项,每次重试间隔 1 秒。当请求失败时,Axios 会自动重试,并在达到最大重试次数后抛出一个 Error 异常。我们可以在调用时捕获这个异常以便进行错误处理

添加请求取消功能

时候,在用户操作过程中,可能需要取消正在进行的请求,例如在切换页面取消一次请求。为了实现这个功能,我们可以使用 Axios 的取消令牌 CancelToken 和取消函数 cancel,例如:

import axios, { AxiosRequestConfig, AxiosResponse, CancelToken } from 'axios';

// 创建一个取消令牌
const cancelToken = axios.CancelToken.source();

// 封装 GET 请求,并添加请求取消功能
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  const defaultConfig = { params, ...config, cancelToken: cancelToken.token };
  return axiosInstance.get<T>(url, defaultConfig);
}

// 取消请求
export function cancelRequest() {
  cancelToken.cancel('请求已取消');
}

在上面的示例中,我们首先创建了一个取消令牌 cancelToken然后将它添加到 GET 请求的配置中。在需要取消请求的时候,我们可以调用 cancelRequest 函数执行取消操作。这样就可以在需要时候随时取消正在进行的请求了。

添加请求缓存功能

时候,一些请求的结果是不会经常发生变化的,例如用户基本信息,这种情况下,我们可以使用请求缓存的功能,避免重复请求,提高系统性能。这可以通过缓存请求结果实现,例如:

import axios, { AxiosRequestConfig } from 'axios';

// 缓存请求结果的 Map 对象
const cacheMap = new Map<string, any>();

// 封装 GET 请求,并添加请求缓存功能
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  const cacheKey = url + JSON.stringify(params);
  const cacheData = cacheMap.get(cacheKey);
  if (cacheData) {
    return Promise.resolve(cacheData);
  }
  const promise = axiosInstance.get<T>(url, { params, ...config });
  promise.then((res) => cacheMap.set(cacheKey, res.data));
  return promise;
}

在这个示例中,我们创建了一个缓存请求结果的 Map 对象 cacheMap,在 GET 请求时,我们先根据请求 URL 和参数生成一个缓存键 cacheKey,然后缓存对象查找是否存在对应缓存数据,如果有则直接返回,否则发送请求,并将请求结果缓存到 cacheMap 对象中。

这样,下次发起相同的请求时,如果缓存存在对应数据,就可以直接返回缓存数据,避免了不必要的网络请求,提高系统性能

Axios请求的优化的一些建议

  1. 使用拦截器批量处理请求和响应数据。 如果我们需要对请求和响应进行一系列处理,那么每个请求都单独处理会导致代码重复和维护成本增加。可以通过使用拦截器统一处理,减少代码重复。例如,可以在请求拦截器中添加公共请求头,或者在响应拦截器统一处理错误信息等。
  2. 合并请求,减少网络请求次数 对于一些需要发送多个请求的场景,可以将多个请求合并成一个请求,减少网络请求次数提高系统性能。例如,可以使用 axios.all 或者 Promise.all 方法来合并多个请求。
  3. 使用 Axios 的并发请求功能。需要发送多个请求的时候,可以使用 Axios 的并发请求功能来同时发送多个请求,提高系统性能。例如,可以使用 axios.spread 方法来同时处理多个请求的响应结果。
  4. 配置全局默认参数,避免重复设置。 如果在大部分请求中使用了相同的配置参数,可以将这些参数设置为全局默认参数,避免在每个请求中重复设置。例如,可以通过 axios.defaults 来设置默认的请求超时时间公共请求头等参数。
  5. 使用第三方插件扩展 Axios 功能。 如果需要使用更多的功能,可以通过使用第三方插件来扩展 Axios 的功能。例如,可以使用 axios-mockadapter模拟后端接口,或者使用 axios-retry实现请求重试功能。

版权为 OpenAI 的 ChatGPT 模型

原文地址:https://blog.csdn.net/wgh2820777641/article/details/129086408

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28014.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注