当前位置: 首页 > article >正文

用原生JS创建简易的axios

1.定义一个函数

function myAxios(config){}

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

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

  1. 判断有没有params选项
  if (config.params) {
          // 2.使用URLSearchParams 转换,并携带到url上
          // 构造函数 得到的是 一个对象
          const paramsObj = new URLSearchParams(config.params)
          const queryString = paramsObj.toString()
          // 把查询参数字符串,拼接在url? 后面
          config.url += `?${queryString}`
        }
  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()
        }
  1. 代码的核心逻辑
		// 添加相应的请求方式,和资源路径
      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. 完整版代码

    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()
        }
      })
    }

http://www.kler.cn/a/420008.html

相关文章:

  • 数据结构实训——查找
  • 华为HarmonyOS 让应用快速拥有账号能力 -- 1 华为账号一键登录
  • Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)
  • centos搭建keepalive
  • 006 MATLAB编程基础
  • vue2 虚拟DOM 和 真实DOM (概念、作用、Diff 算法)
  • Django 视图层
  • openjdk17 jvm 对象 内存溢出 在C++源码体现
  • 数据仓库: 8- 数据仓库性能优化
  • 视频video鼠标移入移除展示隐藏(自定义控件)
  • 第22周:机器学习
  • 从Apache Solr 看 Velocity 模板注入
  • Android:生成Excel表格并保存到本地
  • 使用epoll监测定时器是否到达指定时间,并执行回调函数
  • 前端番外小知识——为什么需要箭头函数?
  • Pytorch使用手册-What is torch.nn really?(专题九)
  • 【电子通识】USB Type-C线缆为什么有的用到E-Marker芯片
  • 数据结构自测题4
  • 【docker】docker网络六种网络模式
  • 雪花算法生成ID
  • git 常用命令及问题
  • 多级缓存设计实践
  • Cannot resolve symbol ‘ActivityThread‘ | Android 语法
  • 【目标跟踪】AntiUAV600数据集详细介绍
  • avcodec_alloc_context3,avcodec_open2,avcodec_free_context,avcodec_close
  • 多功能察打一体多旋翼无人机技术详解