http通信 axios VS fetch

2023-12-20

基本用法

GET

两者都是基于Promise,所以可以使用.then 也可以使用async await。

fetch需要手动对相应内容进行转换,axios会根据响应头类型,进行自动转换。所以axios的代码更加简洁。

      axios.get("http://localhost:8000/api/...").then((res) => {
        console.log(res.data);
      });

      const res = await axios.get("http://localhost:8000/api/...");
      console.log(res.data)


      fetch("http://localhost:8000/api/...")
        .then((res)=>res.text())
        .then(console.log)

      const res = await fetch("http://localhost:8000/api/...");
      const data = await res.text();
      console.log(data)

POST(json+header)

axios的post会自动设置请求的content-type,fetch需要手动设置。除此之外,fetch的json参数需要序列化为字符串。

    const params = {
        name:"zhangsan"
    };
    const headers = {
        "token":"..."
    };
    axios.post(url,params,{headers})


    const params = {
        name:"zhangsan"
    };
    const headers = {
        "token":"...",
        "Content-Type":"application/json"
    };
    fetch(url,{
        method:"POST",
        body:JSON.stringify(params),
        headers
    })

POST(formdata)

对于表单请求,两者都能通过formdata参数指定content-type。

axios提供了直接用于表单请求的方法,可以直接将表单的文件内容作为参数,在某些场景下更方便一些。

    const form = new FormData();
    form.append("name","zhangsan");
    form.append("file",file);
    axios.post(url,form)

    axios.postForm(url,{
        name:"zhangsan",
        _file:file
    })



    const form = new FormData();
    form.append("name","zhangsan");
    form.append("file",file);

    fetch(url,{
        method:"POST",
        body:form
    })

数据流

axios在浏览器环境,并不支持string类型,所以并不能直接处理数据流。如果请求二进制数据,只能通过所有的内容传输完成后,在处理。

fetch可以通过res的body属性实现数据流的处理。

    axios.get(url,{
        responseType:"arraybuffer"
    })
    .then((res)=>{
        // 传输完成后处理res.data
    })


    fetch(url).then((res)=>{
        const reader = res.body.getReader();
    })

中止请求

axios和fetch都可以通过abort方法来中断请求。

    const controller = new AbortController();
    axios.get(url,{
        signal:controllerq.signal
    })

    controller.abort();

    fetch(url,{
        signal:controller.signal
    })  

    controller.abort();

请求超时

axios可以设置超时参数,fetch可以通过abortSignal方法来设置超时,不过这个方法比较新,一些老的浏览器可能不兼容,可以通过abortControl来处理。

    axios.get(url,{
        timeout:5000
    })
    .catch((err)=>{
        if(err.code === "ECONNABORTED"){
            // 超时处理
        }
    })

    fetch(url,{
        signal: AbortSignal.timeout(5000)
    })
    .catch((err)=>{
        if(err.name === "TimeoutError"){
            // 超时处理
        }
    })

进度监控

axios提供了上传/下载进度回调。

fetch没有直接提供进度的回调,可以通过数据流的形式,获取单体下载的进度。对于上传文件,fetch还没办法获取进度。

    axios.post(url,formData,{
        onUploadProgress:(e)=>{
            const percent = Math.round((e.loaded * 100) / e.total);
            console.log(`上传进度:${percent}%`)
        }
    })
    axios.get(url,{
        responseType:"arraybuffer",    
        onDownloadProgress:(e)=>{
            const percent = Math.round((e.loaded * 100) / e.total);
            console.log(`下载进度:${percent}%`)
        }
    })

    const response = await fetch(url);
    const reader = response.body.getReader();
    const total = +response.headers.get("Content-Length");
    let received = 0;   
    while(true){
        const {done,value} = await reader.read();
        if(done){
            break;
        }
        received += value.length;
        console.log(`下载进度:${Math.round((received * 100) / total)}%`)
    }

兼容性

axios支持所有的主流浏览器

基于XMLHttpRequest,向后兼容表现更好。

非浏览器自带,需要安装,占用一些体积,体积敏感需要考虑。

fetch支持所有主流浏览器

相对较新的接口,一些老版本浏览器和IE浏览器可能不支持,虽然可以通过第三方库兼容,但是会失去部分特性。

浏览器自带功能,无需安装,不占体积。

总结

axios和fetch都是好用的http通信方式,绝大部分情况下,axios和fetch都可以满足,只有少数情况下,比如说

相应数据流处理,axios无法满足,需要使用fetch

上传进度监控,fetch无法满足,需要使用axios或者XMLHttpRequest

axios和fetch并不是非要二选一,实际开发中应该根据情况灵活选择,综合运用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

http通信 axios VS fetch 的相关文章

随机推荐

  • 基于PySide6的简易单位转换器

    制作一个简易的长度和重量单位转换器 在qtdesigner中设计如下的界面 下图为全部控件和整体布局 也可以直接复制下面代码 下面是整个ui界面的 ui文件 将其在vscode中新建后使用工具进行编译生成py文件即可 由于上面控件中计算按钮
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子
  • 在scrapy 使用selenium模拟登录获取cookie

    前言 最近有一点点爬虫需求 想总结一下scrapy框架的一些基本使用方法 加深印象 自己一直习惯使用一些脚本文件运行爬虫 面对数据量非常大 稳定性要求比较高的 效率需求比较高的情况下还是用scrapy较为合适 scrapy是一个异步的框架
  • 【转载】【有用】gitee 拉取或push 代码https 协议的地址发生证书错误的解决(server certificate verification failed. CAfile: /etc/s)

    问题描述 从GitHub地址下载内容 提示服务器证书验证失败 没有CRLfile curl 60 server certificate verification failed CAfile etc ssl certs ca certific
  • ChatGLM3-6B 的调用参数说明,chat 与stream_chat 接口函数的参数说明

    ChatGLM3 6B 是一个语言大模型 最近在评估这个模型 但发现它的文档有限 只能从demo代码中猜测调用的参数的含义 准确度是有限的 于是 通过查看源代码来研究 目前整理笔记如下 ChatGLM3 6B 的调用接口有两个 一个是cha
  • vue3+ant 之年份组件

    ant design 框架里的年份组件效果图
  • 一文解决idea导入源码控制台爆红问题

    文章目录 唠嗑部分 背景说明 idea查看maven配置 言归正传 安装maven
  • 医院绩效核算系统源码,java语言开发

    医院绩效考核系统全套源码 医院绩效核算系统源码 java语言开发 医院绩效考核系统可根据工作绩效考核管理规定 配置相应的绩效考核模型 从工作量统计 核算维度 核算权重三方面计算工作绩效 利用数据处理和数据分析的支撑作用 实现对工作量统计和绩
  • 多表插入、删除操作(批量)——后端

    多表插入 场景 当添加一个菜品时 还需要记录菜品的口味信息 因此需要对菜品表 dish 和口味表 dish flavor 同时进行插入操作 两个表的字段 代码思路 由DishController将前端的请求派发给相应的业务层 DishSer
  • vue3封装年份组件

    ant框架年份组件 看了ant框架针对于年份不能自定义插槽内容所以放弃用ant框架年份组件 自定义插槽内容是想实现年份下方可以加小圆点的需求 因加小圆点需求必须实现 决定自己封装组件来实现需求 自己实现的效果呢类似于ant年份控件 在这里做
  • 用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表)

    一 模型user对象 gt 和数据库的字段关联 自动生成 其中涉及删除表数据 一切又从零开始 二 模型user对象 gt 和数据库的字段关联 2 1在model文件夹下 新建 user对象 2 1 1 概念 大家可以想象我们现在的数据是存储
  • ResNet实战:CIFAR-10数据集分类

    本节将使用ResNet实现CIFAR 10数据集分类 7 2 1 CIFAR 10 数据集简介 CIFAR 10数据集共有60000幅彩色图像 这些图像是32 32像素的 分为10个类 每类6000幅图 这里面有50000幅用于训练 构成了
  • ArkTS @Observed、@ObjectLink状态装饰器的使用

    作用 Observed ObjectLink装饰器用于在涉及嵌套对象或者数组元素为对象的场景中进行双向数据同步 状态的使用 1 嵌套对象 我们将父类设置为 Observed状态 这个时候 子应该设置 ObjectLink才能完成数据的双向绑
  • 测试开发 | 个性化推荐引领社交媒体新潮流:定制化互动,畅享个性世界

    在信息爆炸的数字时代 社交媒体的个性化推荐技术正成为用户互动体验的亮点 通过先进的算法和智能化系统 个性化推荐技术为用户提供了更加精准 贴近兴趣的内容 为用户创造了一个充满个性 丰富多彩的社交空间 1 定制化内容 满足个性需求 个性化推荐技
  • 框架网页中如何查看中心网页源码

    框架网页分框架和中心显示页面 直接浏览器右键 显示源码 看到的是框架的网页 方法 假设 框架网址是 a com menu index php 假设 单击菜单后显示的center网页是 manage user php 则我们知道最终中心网页的
  • QT中网络编程之发送Http协议的Get和Post请求

    文章目录 HTTP协议 GET请求 POST请求 QT中对HTTP协议的处理 1 QNetworkAccessManager 2 QNetworkRequest 3 QNetworkReply QT实现GET请求和POST请求
  • 我该如何解除微软账户儿童模式?

    之前注册微软账户时把日期填成小于14岁的了 现在出现由于你的家庭安全设置 你不能使用 Google Chrome 您可以访问以下网页 https account microsoft com family home lang 首先登陆后点击添
  • 华纳云:ServiceComb如何实现zipkin分布式调用链追踪

    Apache ServiceComb是一个开源的微服务框架 它提供了分布式系统开发所需的一系列工具和服务 在ServiceComb中 实现分布式调用链追踪可以通过整合Zipkin来实现 Zipkin是一个开源的分布式追踪系统 它可以帮助你跟
  • 23年12月AI烟火识别系统应用案例-北京梅兰芳故居防火系统

    AI烟火识别智能视频分析系统在文化遗产保护领域的应用 尤其是在梅兰芳故居防火系统的部署 是现代科技与传统文化保护结合的典范 这篇文章将详细介绍富维烟火识别系统的设计 实施及其在23年12月在北京梅兰芳故居中的应用 背景介绍 nbsp 梅兰芳
  • http通信 axios VS fetch

    基本用法 GET 两者都是基于Promise 所以可以使用 then 也可以使用async await fetch需要手动对相应内容进行转换 axios会根据响应头类型 进行自动转换 所以axios的代码更加简洁 axios get htt