手写实现axios库请求方法实现

简介: 手写实现axios库请求方法实现

上一篇文章中,我们实现了axios对象的创建,我们今天来实现一下axios的请求操作


其实axios中无论是get请求还是post的请求最后都是走的request这个请求方法,所以我们要对axios中的request进行操作即可,首先要了解一下axios在发送请求的过程中做了那些事情


接下来我们来实现一下axios中的request方法

Axios.prototype = {
            // 请求方法
            request(config = {}) {
// 声明一个成功的promise,使得返回config返回的是一个成功的promise
            let promise =Promise.resolve(config);
// 声明一个数组,这里第二个参数声明一个undefined是为了做一个占位,如果没有这个值,运行会出现问题
            let chains=[dispatchRequest,undefined]
// 调用then方法进行指定回调,这里指定成功和失败的回调,这里由于使用promise所有这个result接收的就是一个对象处理成功过后的返回实例
         let result=   promise.then(chains[0],chains[1]);
        //  把promise返回出去
         return result
            }
        }

dispatchRequest函数中做的就是一个request方法中的一个then成功的操作函数,通过xhrAdapter函数去发送请求,返回的是请求成功或失败的操作

// dispatchRequest 函数
        function dispatchRequest(config){
// 这里通过then方法调用所以指明了xhrAdapter函数的返回值一定是一个promise对象,xhrAdapter函数作为我们的返回值,所以当前的dispatchRequest函数也一定是一个promise对象
return xhrAdapter(config).then(response=>{
// 对响应的结果进行返回
return response;
},error=>{
    // 返回失败则抛出错误
    throw error;
    console.log(error);
})
        }

xhrAdapter函数中包含的是一个通过promise对象封装原生XMLHttpRequest对象发送请求的操作,通过判断状态码和请求状态以此判定请求是否成功,如果请求状态是未返回状态则不进行操作,如果请求状态完成则进行判断状态码,如果状态码为成功的状态则进行返回resolve,否则返回reject

// 在这里,如果这个请求发送成功了,这个then方法中会去执行第一个回调函数,否则就会去执行第二个抛出错误
        function  xhrAdapter(config){
return new Promise((resolve,reject)=>{
    // 发送xhr请求
    const XHR=new XMLHttpRequest()
    // 初始化请求
    XHR.open(config.method,config.url);
    // 发送请求
    XHR.send()
    // 绑定事件
    XHR.onreadystatechange=function(){
// 判断请求状态是否成功
// 0:开始发送请求
// 1:正在发送请求
// 2:已经接收到全部响应内容
// 3:正在解析响应内容
// 4:请求完成
        if(XHR.readyState==4){
// 判断请求是否发送成功,请求响应状态码大于或等于200且小于300则是成功否则就是失败
if(XHR.status>=200&&XHR.status<300){
// 成功,则返回promise的成功状态,以此后几个函数会因此继续往下运行,
// 先会让dispatchRequest函授接收到成功的值
resolve({
    // 配置对象
    config:XHR.config,
    // 响应体
    data:XHR.response,
       // 响应头
       headers:XHR.getAllResponseHeaders(),
    //   XHR请求对象 
    request:XHR,
//  响应的状态码
    status:XHR.status,
    // 响应状态字符串
    statusText:XHR.statusText,
});
}else{
    // 失败就抛出错误
    reject(new Error('请求失败'))
}
        }
    }
})
      }

我们来使用一下,看一下结果

cd9918c197ac47019b8d0647c4a7e32a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

完美运行

代码我放到码上掘金上了,大家可以去看看

image.png

坚持努力,无惧未来


相关文章
|
2月前
|
资源调度 JavaScript
|
2月前
|
缓存 JavaScript 搜索推荐
|
1月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
47 2
|
21天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
34 0
|
2月前
|
Python
axios的get请求传入数组参数
【10月更文挑战第11天】 当使用 `axios` 发送包含数组参数的 GET 请求时,默认的序列化方式可能与后端(如 Django)不兼容,导致无法正确获取数组参数。解决方案是通过 `paramsSerializer` 指定自定义序列化函数,或使用 `qs` 库来格式化数组参数,确保前后端一致。示例代码展示了如何使用 `qs` 库设置 `arrayFormat` 为 `&quot;repeat&quot;`,以符合 Django 的解析要求。
65 2
|
2月前
|
JSON JavaScript 前端开发
axios的post请求,数据为什么要用qs处理?什么时候不用?
axios的post请求,数据为什么要用qs处理?什么时候不用?
|
3月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
51 6
|
2月前
|
前端开发 JavaScript API
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
89 0
|
2月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
125 0