用原生JS创建简易的axios

1.定义一个函数

function myAxios(config){}

  1. 此时我们要考虑axios中是如何使用的,axios 中可能会存在 url(资源路径) ,params(请求参数),method(请求方式),data(请求数据),其中url一定是要有的
  2. 我们要有一定的知识储备,如Promise, URLSearchParams, XHL 的一些基本的使用

2. 给函数添加相应的逻辑

  1. 判断有没有params选项
java 复制代码
  if (config.params) {
          // 2.使用URLSearchParams 转换,并携带到url上
          // 构造函数 得到的是 一个对象
          const paramsObj = new URLSearchParams(config.params)
          const queryString = paramsObj.toString()
          // 把查询参数字符串,拼接在url? 后面
          config.url += `?${queryString}`
        }
  1. 判断有没有data选项,携带请求体
java 复制代码
    if (config.data) {
          // 2. 将对象转换成JSON字符串
          const jsonStr = JSON.stringify(config.data)
          // 3. 在发送请求体时,要说命数据的类型
          xhr.setRequestHeader('Content-Type', 'application/json')
          xhr.send(jsonStr)
        } else {

          xhr.send()
        }
  1. 代码的核心逻辑
java 复制代码
		// 添加相应的请求方式,和资源路径
      xhr.open(config.method || 'GET', config.url)
      	// 绑定loadend事件
        xhr.addEventListener('loadend', () => {
        // 判断是否成功
          if (xhr.status >= 200 && xhr.status < 300) {
          // 成功调用,成功回调函数
            resolve(JSON.parse(xhr.response))
          } else {
          // 失败 调用失败回调函数
            reject(new Error(xhr.response))
          }
        })

3. 完整版代码

java 复制代码
    function myAxios(config) {
      return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest()
        // 1.判断有没有params选项, 携带查询参数
        if (config.params) {
          // 2.使用URLSearchParams 转换,并携带到url上
          // 构造函数 得到的是 一个对象
          const paramsObj = new URLSearchParams(config.params)
          const queryString = paramsObj.toString()
          // 把查询参数字符串,拼接在url? 后面
          config.url += `?${queryString}`
        }


  		// 添加相应的请求方式,和资源路径
      xhr.open(config.method || 'GET', config.url)
      	// 绑定loadend事件
        xhr.addEventListener('loadend', () => {
        // 判断是否成功
          if (xhr.status >= 200 && xhr.status < 300) {
          // 成功调用,成功回调函数
            resolve(JSON.parse(xhr.response))
          } else {
          // 失败 调用失败回调函数
            reject(new Error(xhr.response))
          }
        })

        // 1. 判断有没有data选项,携带请求体
        if (config.data) {
          // 2. 将对象转换成JSON字符串
          const jsonStr = JSON.stringify(config.data)
          // 3. 在发送请求体时,要说命数据的类型
          xhr.setRequestHeader('Content-Type', 'application/json')
          xhr.send(jsonStr)
        } else {

          xhr.send()
        }
      })
    }
相关推荐
Gigavision2 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
IPdodo_3 小时前
跨境 API 调用不稳定怎么办:出口、超时重试与链路监控的实践
网络·python·网络协议
Madison-No73 小时前
搭建项目测试环境
linux·运维·服务器·python
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
计算机编程-吉哥3 小时前
YOLO26 vs YOLO11 vs YOLOv8:深度学习咖啡果实成熟度分割系统【计算机毕业设计选题推荐】
人工智能·python·深度学习·yolo·django·毕业设计
半个落月4 小时前
LangChain.js Agent Memory 实战(下):用 Milvus 构建可检索的长期记忆
javascript·langchain
半个落月4 小时前
LangChain.js Agent Memory 实战(上):从内存对话、文件持久化到截断与摘要
javascript·langchain
大衛說4 小时前
11 · 异常处理与日志
python
auto_go4 小时前
Python 实战指南(7)——账本动不动就崩?先把“魔法字符串”和“裸报错”干掉
python
Beyond_System|系统之外4 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法