学习记录-Ajax-自封装axios函数

发布于:2025-03-23 ⋅ 阅读:(26) ⋅ 点赞:(0)

自封装axios函数

封装axios函数实现步骤

1. 准备阶段

理解axios函数的底层原理,包括Promise,XMLHttpRequest等概念

  1. XMLHttpRequest工作过程
    先创建一个XMLHttpRequest实例对象,设置请求方式和url地址,绑定loadend事件,响应.reponse,最后在发送数据。如果请求方式为get,则需要将查询参数写在url网址后,如果请求方式为post,则寻要在发送请求前设置相应头
  2. promise工作
    先创建一个promise实例对象,里面传递resolve,reject两个参数。resolve代表请求成功,调用then;reject代表请求失败,调用catch

自行准备接口

2. 实现无参get请求

利用promise的.then方法,封装axios函数,返回一个promise实例对象,赋予函数.then方法

  1. 如果method为空,则默认为get方法
  2. 判断ajax.status的值,如果访问成功,则用resolve传response,如果访问失败,则用reject抛错误
	function myAxios(obj) {
      return new Promise((resolve, reject) => {				//确保自定义axios函数可以调用.then和.catch方法
        const ajax = new XMLHttpRequest()
        ajax.open(obj.method || 'get', obj.url)				//如果method为空,则为get方法
        ajax.addEventListener('loadend', (e) => {
          if(ajax.status>=200&&ajax.status<300){			//判断相应是否成功
            resolve(ajax.response)
          }else{
            reject(new Error(ajax.response))
          }         
        })
      ajax.send()
      })

    }

3.实现有参get请求

在配置请求方法前,对params进行判断,如果存在params,则将其转换为查询字符串,并且拼接到url网址后

    	const a = obj.params ? '?'+new URLSearchParams(obj.params) : ''			//转换查询参数
        ajax.open(obj.method || 'get', `${obj.url}${a}`)						//查询参数拼接

4. 实现post请求

在数据发送前判断data是否存在,如果存在则先设置相应头,在将data数据以JSON字符串的形式发送出去

	if(obj.data){
          ajax.setRequestHeader('Content-Type', 'application/json')
          ajax.send(JSON.stringify(obj.data))				//发送的数据为JSON字符串形式
        }
       else{
        ajax.send()
       }

完整实例代码

<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>封装_简易axios函数_获取省份列表</title>
</head>

<body>
  <script>
    function myAxios(obj) {
      return new Promise((resolve, reject) => {
        const ajax = new XMLHttpRequest()
        const a = obj.params ? '?' + new URLSearchParams(obj.params) : ''
        ajax.open(obj.method || 'get', `${obj.url}${a}`)
        ajax.addEventListener('loadend', (e) => {
          if (ajax.status >= 200 && ajax.status < 300) {
            resolve(ajax.response)
          } else {
            reject(new Error(ajax.response))
          }
        })
        if (obj.data) {
          ajax.setRequestHeader('Content-Type', 'application/json')
          ajax.send(JSON.stringify(obj.data))
        }
        else {
          ajax.send()
        }
      })
    }
    myAxios({
      url: 'http://hmajax.itheima.net/api/register',
      data: {
        username: 'baiyuansong',
        password: '1234567'
      },
      method: 'post'
    }).then(res => {
      console.dir(res)
    })
  </script>
</body>

</html>