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 的相关文章

  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt
  • POST 之后在 PHP 中设置 Location 标头时避免 HTTP 302 响应代码

    我需要放一个201 CreatedPOST 请求的响应代码和 Location 标头 但由于某种原因我仍然收到 302 响应 这就是我所拥有的 header HTTP 1 1 201 header Location The new reso
  • 通用开源 REST 客户端? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 静默地将 api 资源移动到另一个 url

    我已经用 WepApi 2 编写的 api 与主网站紧密结合 我决定将其与另一个网络应用程序解耦 以使事情更加隔离 我遵循了这样的步骤 将所有 API 控制器提取到另一个项目 创建属性以将当前使用旧 URL 的所有用户重定向到新 URL 由
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • REST URL 结构建议

    我正在尝试为我正在开发的网站的愿望清单部分敲定一个宁静的网址结构 这是一个非常简单的模型 用户可以有许多愿望清单 每个愿望清单可以包含许多产品 目前我有明显的 CRUD URL 来操作愿望清单本身 GET account wishlists
  • 使用传输编码分块的 HTTP 响应中的最大块大小是多少?

    The w3 org RFC2616 http www w3 org Protocols rfc2616 rfc2616 sec3 html sec3 6 1似乎没有定义块的最大大小 但是如果没有最大块大小 则没有空间用于块扩展 必须有一个
  • Apache HTTP localhost 在 macOS Monterey 上随机花费 5 秒,但在 HTTPS 上速度很快

    我尽可能地等待 但最终不得不从莫哈韦升级 我知道有些东西会不必要地损坏 当然确实如此 较大的文件 超过 100k 随机需要 5 秒才能加载 它并不总是相同的文件 也不是每次都相同 并且它只发生在 HTTP Apache 中 尝试过端口 80
  • Jsoup http 日志记录

    有没有办法记录http请求和响应 我们假设以下请求 Connection Response res Jsoup connect LOGIN URL HERE data user USER pass PASS method Connectio
  • HTTP请求压缩

    一般用例 想象一下一个正在上传大量 JSON 的客户端 内容类型应保留application json因为这描述了实际数据 Accept Encoding 和 Transfer Encoding 似乎是为了告诉服务器应该如何格式化响应 看起
  • 在 Ubuntu 12.04 上的 Apache 上配置 SVN 服务器

    我正在尝试通过 HTTP 访问现有的 Subversion 服务器 我的dav svn conf文件看起来像
  • 如何使用独立的 Jetty 进行服务器推送

    我正在尝试使用独立的 Jetty 在静态网站上测试服务器推送功能 我的网站由一个index html 1个CSS 一堆图像组成 目录结构为 Album index html style css images image 1 png a se
  • HTTP 和 HTTPS iframe

    我正在创建一个小部件 我想允许其他人使用它 这iframe通过 HTTP 加载 但我想允许用户通过 HTTPS 登录 即通过 SSL 发送登录请求 同源策略中允许这样做吗 即 场景是用户可以将我的 JavaScript 集成到他们的网站 小
  • 由于请求的资源上不存在“Access-Control-Allow-Origin”标头,无法获取与 Axios 的链接请求

    我正在尝试使用 cryptocompare api 来获取 axios 的 coindata 列表 但我不知道如何解决这个问题 我相信这是一个 CORS 问题 但我不确定 完整错误如下 加载失败https www cryptocompare
  • .NET 中有什么方法可以以编程方式侦听 HTTP 流量吗?

    我正在使用浏览器自动化来测试网站 但我需要验证来自浏览器的 HTTP 请求 即图像 外部脚本 XmlHttpRequest 对象 有没有一种方法可以以编程方式实例化代理以供浏览器使用以查看其发送的内容 我已经在使用 Fiddler 来监视流
  • HTTP部分上传、断点续传的标准方法

    我正在开发 http 客户端 服务器框架 并寻找处理部分上传的正确方法 与使用带有 Range 标头的 GET 方法进行下载相同 但是 HTTP PUT 并不打算恢复 据我所知 PATCH 方法不接受 Range 标头 有没有办法通过 HT
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • 返回重定向作为对 Ajax(fetch、XHR 等)请求的响应

    如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果服务器发送重定向 又名 302 响应加上 Location 标头 浏览器将自动遵循重定向 对此的回应second请求 假
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http

随机推荐

  • 基于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