实现简易的 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);
    });
相关推荐
郑寿昌6 分钟前
IIoT本体迁移的领域扩展机制
服务器·前端·microsoft
机器视觉知识推荐、就业指导23 分钟前
Qt:真正的门槛不是入门,而是维护
开发语言·qt
深海鱼在掘金29 分钟前
Next.js从入门到实战保姆级教程(第十一章):错误处理与加载状态
前端·typescript·next.js
深海鱼在掘金33 分钟前
Next.js从入门到实战保姆级教程(第十二章):认证鉴权与中间件
前端·typescript·next.js
hhb_61841 分钟前
Dylan 语言核心特性与工程实践深度解析
开发语言·c#
energy_DT1 小时前
2026年十五五油气田智能增产装备数字孪生,CIMPro孪大师赋能“流动增产工厂”三维可视化管控
前端
龙猫里的小梅啊1 小时前
CSS(四)CSS文本属性
前端·css
无巧不成书02181 小时前
零基础Java网络编程全解:从核心概念到Socket实战,一文打通Java网络通信
java·开发语言·网络
MXN_小南学前端1 小时前
watch详解:与computed 对比以及 Vue2 / Vue3 区别
前端·javascript·vue.js
饭小猿人1 小时前
Flutter实现底部动画弹窗有两种方式
开发语言·前端·flutter