Axios 源码解读 —— 源码实现篇

本文详细解读了如何使用TypeScript构建一个简易的Axios实现,包括Axios实例、请求方法、拦截器和取消请求的机制。通过改造Axios类,添加interceptors管理拦截器,并实现CancelToken进行请求取消。最后,文章总结了简易Axios的基本功能和应用潜力。
摘要由CSDN通过智能技术生成

在上两期,我们讲解了 Axios 的源码:

今天,我们将实现一个简易的 Axios,用于在 Node 端实现网络请求,并支持一些基础配置,比如 baseURL、url、请求方法、拦截器、取消请求…

本次实现所有的源码都放在 这里,感兴趣的可以看看。

Axios 实例

本次我们将使用 typescript + node 来实现相关代码,这样对大家理解代码也会比较清晰。

这里,先来实现一个 Axios 类吧。

type AxiosConfig = {
   
  url: string;
  method: string;
  baseURL: string;
  headers: {
   [key: string]: string};
  params: {
   };
  data: {
   };
  adapter: Function;
  cancelToken?: number;
}

class Axios {
   
  public defaults: AxiosConfig;
  public createInstance!: Function;

  constructor(config: AxiosConfig) {
   
    this.defaults = config;
    this.createInstance = (cfg: AxiosConfig) => {
   
      return new Axios({
    ...config, ...cfg });
    };
  }
}

const defaultAxios = new Axios(defaultConfig);

export default defaultAxios;

在上面,我们主要是实现了 Axios 类,使用 defaults 存储默认配置,同时声明了 createInstance 方法。该方法会创建一个新的 Axios 实例,并且会继承上一个 Axios 实例的配置。

请求方法

接下来,我们将对 https://mbd.baidu.com/newspage/api/getpcvoicelist 发起一个网络请求,将响应返回的数据输出在控制台。

我们发起请求的语法如下:

import axios from './Axios';

const service = axios.createInstance({
   
  baseURL: 'https://mbd.baidu.com'
});

(async () => {
   
  const reply = await service.get('/newspage/api/getpcvoicelist');
  console.log(reply);
})();

request 方法

我们先来给我们的 Axios 类加上一个 requestget 方法吧。

import {
    dispatchRequest } from './request';

class Axios {
   
  //...

  public request(configOrUrl: AxiosConfig | string, config?: AxiosConfig) {
   
    if (typeof configOrUrl === 'string') {
   
      config!.url = configOrUrl;
    } else {
   
      config = configOrUrl;
    }
    
    const cfg = {
    ...this.defaults, ...config };
    return dispatchRequest(cfg);
  }

  public get(configOrUrl: AxiosConfig | string, config?: AxiosConfig) {
   
    return this.request(configOrUrl, {
   ...(config || {
   } as any), method: 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值