实现简易的 axios

1、实现逻辑

Promise + XMLHttpRequest 封装

① 返回一个 promise 实例

new XMLHttpRequest 并设置默认请求方式、请求根路径;

添加请求+响应事件;

根据状态码,对应执行成功或者失败的调用函数,并把结果传进去;

② 处理 params

如果有 params,就 new URLSearchParams() 对象,并把传进来的 params 传到对象里;

再用 toString 方法转成 URL 编码字符串,最后再拼接 url 来覆盖 url 默认值

③ 处理 data

如果有 data,就 xhr.setRequestHeader 设置请求头的请求数据类型;

比如 JSON 字符串,就还需要用 JSON.stringify 转成 JSON 字符串

最后传到 send 携带 JSON 字符串发起请求

2、封装代码

javascript 复制代码
  // 实现简易的axios   
  function myAxios(config) {
    return new Promise((resolve, reject) => {
      // 实例化xhr
      const xhr = new XMLHttpRequest()
      // 默认get请求
      let { methods = "get", url, params = "", headers = "", data = "" } = config
      // 将传入的params对象转成URL编码字符串
      if (params) {
        const parseParams = new URLSearchParams(params)
        url += `?${parseParams.toString()}`
      }
      // 设置请求方法+请求地址
      xhr.open(methods, url)
      // 设置请求头
      if (headers) {
        Object.keys(headers).forEach((key) => {
          xhr.setRequestHeader(key, headers[key])
        })
      } else {
        xhr.setRequestHeader("Content-Type", "application/json")
      }
      // 添加请求响应事件
      xhr.addEventListener("loadend", () => {
        if (xhr.status >= 200 && xhr.status < 300) {
          // 成功
          resolve(JSON.parse(xhr.response))
        } else {
          reject(new Error(xhr.response))
        }
      })
      // data对象
      if (data) {
        // 设置请求头,请求数据类型设置为 JSON 字符串
        xhr.setRequestHeader("Content-Type", "application/json") // 转 JSON 字符串
        // 构造参数
        const jsonDate = JSON.stringify(data)
        // 发起请求
        xhr.send(jsonDate)
      } else {
        // 发起请求
        xhr.send()
      }
    })
  }

3、使用

javascript 复制代码
  // 使用
  myAxios({
    methods: "get",
    url: "/1.json",
    headers: {
        "token": "123"
    },
    params: {
      name: "strawberry",
      age: 18,
    },
    // data: {
    //   name: "strawberry",
    //   age: 18,
    // },
  })
    .then((res) => {
      console.log("成功", res);
    })
    .catch((err) => {
      console.log("失败", err);
    });
相关推荐
不会代码的小猴4 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
紫禁玄科5 小时前
Shai-Hulud:npm生态的自我复制蠕虫风暴
前端·npm·node.js
东风破_5 小时前
后端API没写好,前端难道干等着吗?
前端
用户938515635075 小时前
从前后端分离到前端接口工程:React + MockJS + Vite 解析
前端·后端·全栈
一只旭宝5 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
用户938515635075 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformers.js 全链路实战(三)
前端·react.js·typescript
excel5 小时前
当前端行情变差,我们为什么还要坚持?
前端
鸿是江边鸟,曾是心上人6 小时前
快速搭建HTTPS本地开发环境
前端
To_OC7 小时前
写了 5 个表单 Demo 后,我终于彻底搞懂了 React 受控与非受控组件
前端·react.js·前端框架
Sterting7 小时前
第9课 Vue Router 路由
前端·vue.js