• 利用Axios封装及泛型实现定制化HTTP请求处理


          本案例旨在教授如何使用Axios库结合TypeScript泛型进行HTTP请求的高级封装,以提升代码的可复用性和类型安全性。我们将通过一个具体的示例,学习如何创建一个通用的请求函数,它能够适应不同类型的API响应,并在请求前后加入自定义逻辑(如错误处理、Token注入等)。

    1. 引入必要的库和类型

    • 引入Axios:首先,我们导入Axios库及其相关类型,用于发起网络请求。
    • 定义类型:引入AxiosInstance和AxiosRequestConfig类型,以增强代码的类型提示和安全性。
    1. import axios, { type AxiosResponse } from 'axios';
    2. import type { AxiosInstance, AxiosRequestConfig } from 'axios';

    2. 创建Axios实例并配置

    • 配置基础设置:通过axios.create方法创建一个Axios实例,并设置基础URL和超时时间等默认配置
    1. const axiosInstance: AxiosInstance = axios.create({
    2. baseURL: 'https://tenapi.cn/v2/',
    3. timeout: 10000
    4. });

    3. 添加请求和响应拦截器

    • 请求拦截器:在请求发送前可以统一处理逻辑,如添加认证信息。
    • 响应拦截器:对返回的响应进行统一处理,如错误码判断。
    1. axiosInstance.interceptors.request.use(config => {
    2. // 可以在此处添加Token或其他请求头
    3. return config;
    4. }, error => Promise.reject(error));
    5. axiosInstance.interceptors.response.use(res => res, error => Promise.reject(error));

     4. 定义API响应接口

    • ApiResponse接口:定义一个泛型接口来规范API响应的结构,包含状态码、消息、时间戳和数据部分。
    1. export interface ApiResponseany> {
    2. code: number;
    3. msg: string;
    4. timestamp: number;
    5. data: T;
    6. }

    5. 封装请求函数

    • 泛型request函数:创建一个异步的泛型函数request,它接受请求配置并返回经过类型转换的响应数据。 
    1. export async function request(config: AxiosRequestConfig): Promise {
    2. return axiosInstance.request<ApiResponse>(config).then(res => res.data);
    3. }

    6. 使用封装的请求函数

    • 具体请求示例:定义一个数据模型Hot,并使用request函数发起请求,处理响应数据
    1. interface Hot {
    2. name: string;
    3. url: string;
    4. hot: number;
    5. }
    6. request<Array<Hot>>({
    7. url: '/baiduhot',
    8. method: 'get'
    9. }).then(res => {
    10. if(res.code === 200) {
    11. const hot = res.data[0];
    12. console.log(hot.name);
    13. }
    14. });

    6. 完整代码

    1. import axios, {type AxiosResponse} from 'axios';
    2. import type { AxiosInstance, AxiosRequestConfig } from 'axios';
    3. /* 创建axios实例 */
    4. const axiosInstance : AxiosInstance = axios.create({
    5. baseURL: 'https://tenapi.cn/v2/',
    6. timeout: 10000
    7. });
    8. /* 封装实例的请求拦截器 */
    9. axiosInstance.interceptors.request.use( config => {
    10. return config;
    11. }, (error) => {
    12. return Promise.reject(error);
    13. });
    14. /* 封装实例的响应拦截器 */
    15. axiosInstance.interceptors.response.use( (res : AxiosResponse<any>) => {
    16. return res;
    17. }, (error) => {
    18. return Promise.reject(error);
    19. });
    20. /* 定义接口 */
    21. export interface ApiResponse {
    22. code: number;
    23. msg: string;
    24. timestamp: number;
    25. data: T;
    26. }
    27. /* 封装实例的请求方法 */
    28. export async function request(config: AxiosRequestConfig ) {
    29. // axios实例的 request 接受的第一个泛型参数,就是返回数据data的类型
    30. return axiosInstance.request<ApiResponse>(config).then((res) => res.data);
    31. }
    32. /* 如何使用代码如下 */
    33. interface Hot {
    34. name: string;
    35. url: string;
    36. hot: number;
    37. }
    38. request<Array<Hot>>({
    39. url: '/baiduhot',
    40. method: 'get'
    41. }).then(res => {
    42. if(res.code == 200) {
    43. let hot = res.data[0];
    44. console.log(hot.name);
    45. }
    46. });

    提示:更多的Axios配置信息请看官网

  • 相关阅读:
    Mysql性能优化-----持续更新
    【数学建模】混合整数规划MIP(Python+Gurobi代码实现)
    2022牛客多校(五)
    (mac M1)Flutter环境搭建
    rabbitmq3
    flink教程
    gRPC协议详解
    论文阅读: Disentangled lmage Colorization via Global Anchors
    【漏洞复现】红帆iOffice.net wssRtSyn接口处存在SQL注入
    面试二十二、跳表SkipLists
  • 原文地址:https://blog.csdn.net/m0_55337678/article/details/139601979