fetch网络请求详解

news2024/9/22 11:35:11

一:三种常见的网络请求对比:

  1. AJAX:基于XMLHttpRequest收发请求,使用较为繁琐,代码量会比较多
  2. axios:基于promise的请求客户端,在浏览器和node中均可使用,使用便捷,功能强大
  3. fetch:内置api,基于promise,用法和axios类似,功能更为简单,没有axios那么强大

        AJAX现在一般为学习过渡使用,日常开发中一般不会使用。做项目的时候一般是使用axios,当项目规模比较小,调用接口次数很少的时候可以使用 fetch 替换 axios ,这样更为便捷迅速。

        如果你想了解fetch参数,可以参考文章fetch() - Web API 接口参考 | MDN。本文主要是讲解fetch的使用。

二:fetch详解

全局的fetch()方法用于发起获取资源的请求,它返回一个promise,这个promise会在请求响应后被resolve,并传回request对象。

1、fetch核心语法

        下面代码是一个简答的fetch请求,在这些请求中,我们主要分为以下三步:

  •  发送请求
  • 处理响应(JSON)
  • 处理异常

        在这里我们要注意,我们的参数是使用的一个 URLSearchParams 对象,在url传参中使用 toString() 方法去完成参数的传递。并且 fetch 的请求方式默认为 get 。并且返回的是一个promise ,所以我们需要使用 await 进行等待。并且处理最终返回的 JSON 对象。

<body>
    <h2>fetch核心语法</h2>
    <button class="btn">测试</button>
    <script>
        document.querySelector('.btn').addEventListener('click',async () => {
            // 生成一个params,方便后面转换成字符串
            const p = new URLSearchParams({pname:'贵州省',cname:'贵阳市'})
            // 发送请求,默认是get方法
            const res = await fetch('http://hmajax.itheima.net/api/area?' + p.toString())
            
            // 获取返回的结果状态码
            console.log(res.status);

            // 解析返回的json串
            if(res.status>=200 && res.status <300){
               const data = await res.json()
               console.log(data);
            }else{
                // 这里是请求异常的响应
                console.log('请求异常',res.status);
            }
        })
    </script>
</body>

2、fetch提交FormData

        在实际的项目开发中,提交文件一般是FormData格式,因此与JSON格式写法是不一样的,但是其实思路也是可以分为请求方法和提交数据,解析返回值三步。接下来让我们来看一下代码的具体实现。

        在下方代码中,HTML中是上传图片和图片的回显,使用 DOM 去绑定事件。获取到选择的图片,然后添加到 FormData 对象中,在上传接口中将 FormData 传递过去。而后去处理返回的结果,拿到返回结果中的 url 地址,再使用 DOM 去回显到我们的 img 标签。

<body>
    <h2>提交FormData</h2>
    <input type="file" class="ipt">
    <img src="" alt="" class="icon">
    <script>
        document.querySelector('.ipt').addEventListener('change',async function() {
            // 获取选择的图片
            const img = this.files[0]
            // 将选择的图片添加到FormData对象中
            const data = new FormData()
            data.append('img',img)
            // 使用fetch上传
            const res = await fetch('http://hmajax.itheima.net/api/uploadimg',{
                method:'post',
                body:data
            })
            
            // 获取返回的结果状态码
            console.log(res.status);

            // 解析返回的json串
            if(res.status>=200 && res.status <300){
               const resData = await res.json()
               console.log(resData);
               // 回显
               document.querySelector('.icon').src = resData.data.url
            }else{
                // 这里是请求异常的响应
                console.log('请求异常',res.status);
            }
        })
    </script>
</body>

3、fetch提交JSON

        跟服务器正常通信一般是 JSON 对象,这个区别于 FormData 主要是对了请求头设置这一步。下面让我们来看一下具体的实现步骤吧!

<body>
    <h2>fetch提交JSON</h2>
    <button class="btn">提交JSON</button>
    <script>
        document.querySelector('.btn').addEventListener('click',async () => {
            // 实例化Headers对象
            const headers = new Headers()
            // append 添加 keyvalue
            headers.append('content-type','application/json')


            const res = await fetch('http://hmajax.itheima.net/api/register',{
                method:'post',
                // 这里因为和上面的headers是同名的,所以直接简写
                headers,
                // 因为要传JSON对象,所以需要转一下
                body:JSON.stringify({
                    username:'baoNvCode',
                    password:'123456'
                })
            })
            
            // 获取返回的结果状态码
            console.log(res.status);

            // 解析返回的json串
            if(res.status>=200 && res.status <300){
               const resData = await res.json()
               console.log(resData);
            }else{
                // 这里是请求异常的响应
                console.log('请求异常',res.status);
            }
        })
    </script>
</body>

三:总结

         fetch 适用于开发请求接口次数少的项目,这种情况下相较于axios能够更加的节省资源,以及提高代码的简洁性,降低后期维护需要的成本。掌握 fetch 是不难的,主要是要学会各种情况下的不同使用,以及不同参数的书写逻辑。好啦本文就到此位置了,希望能够对你有所帮助哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第五部分:支付系统

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第五部分&#xff1a;支付系统前言如何学习支付系统信用卡为什么被称为“银行最赚钱的产品”&#xff1f;VISA/万事达卡如何赚钱&#xff1f;步骤说明为什么开证行应该得到补偿 当我们在商家…

Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)

文章目录 1. Linux软件包管理器——yumyum 语法yum 常用命令安装 yum 仓库源 2. Linux编辑器——vimvim 的五种常用模式模式切换vim 基本操作命令模式命令集&#xff08;1&#xff09;光标命令&#xff08;2&#xff09;复制粘贴命令&#xff08;3&#xff09;撤销与重做&#…

深度学习---卷积神经网络

卷积神经网络概述 卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域。往往输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高。另外图像也很难保留原有的特征&#xff0c;导致图像处理的准确率不高。 卷积神经网络&#xff0…

安全多方计算框架最全合集(持续更新)

安全多方计算框架 本文对现有安全多方计算/学习框架进行了全面、系统的梳理。 目前大部分安全多方计算框架主要基于秘密共享、同态加密、混淆电路以及相关基本模块的组合。通常使用定制的协议来支持特定数量的参与方&#xff08;一般为两方或三方&#xff09;&#xff0c;导致…

我发现用StarUML来画UML也挺香的

2023年10月22日&#xff0c;周日晚上 我已经决定以后都用StarUML来画UML了&#xff0c;因为这个软件不仅免费&#xff0c;而且太适合画UML图了 我之前主要用plantUML和draw.io来画UML&#xff0c; plantUML虽然是通过文本来生成UML图&#xff0c;但是排版不是不好看&#xff…

“智能文件批量改名工具:轻松管理文件名,一键去除特殊符号“

你是否曾经在面对一堆文件名中包含特殊符号&#xff0c;而感到困扰&#xff0c;不知道如何快速、准确地处理它们&#xff1f;现在&#xff0c;我们为你带来了一款智能文件批量改名工具&#xff0c;它可以轻松地帮助你去除文件名中的特殊符号&#xff0c;让你的文件管理更加规范…

【试题002】C语言有关于sizeof的使用

1.说明&#xff1a;sizeof()是测量数据类型所占用的内存字节数&#xff0c;字符串常量在存储时除了要存储有效字节外&#xff0c;还要存储一个字符串结束志‘\0’。 2.代码举栗子&#xff1a; #include <stdio.h> int main() {char str[] "book";printf(&qu…

网络协议--Traceroute程序

8.1 引言 由Van Jacobson编写的Traceroute程序是一个能更深入探索TCP/IP协议的方便可用的工具。尽管不能保证从源端发往目的端的两份连续的IP数据报具有相同的路由&#xff0c;但是大多数情况下是这样的。Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过…

开源LLEMMA发布:超越未公开的顶尖模型,可直接应用于工具和定理证明

深度学习自然语言处理 原创作者&#xff1a;Winnie 今天向大家介绍一个新的开源大语言模型——LLEMMA&#xff0c;这是一个专为数学研究而设计的前沿语言模型。 LLEMMA解数学题的一个示例 LLEMMA的诞生源于在Proof-Pile-2数据集上对Code Llama模型的深度训练。这个数据集是一个…

Java 8 新特性 Ⅱ

方法引用 举例: Integer :: compare 理解: 可以看作是基于lambda表达式的进一步简化 当需要提供一个函数式接口的实例时, 可以使用lambda表达式提供实例 当满足一定条件下, 可以使用方法引用or构造器引用替换lambda表达式 实质: 方法引用作为函数式接口的实例 (注: 需要熟悉…

【AOA-VMD-LSTM分类故障诊断】基于阿基米德算法AOA优化变分模态分解VMD的长短期记忆网络LSTM分类算法(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

人大金仓获评“2023年度软件和信息技术服务名牌企业”

近日&#xff0c;中国电子信息行业联合会在2023世界数字经济大会暨第十三届智慧城市与智能经济博览会上&#xff0c;发布了“2023年度软件和信息技术服务名牌企业”&#xff0c;凭借在企业规模、技术创新、市场影响力等方面的突出表现&#xff0c;人大金仓成功入选。 此次评选在…

计组03:20min导图复习 中央处理器

&#x1f433;前言 图源&#xff1a;文心一言 考研笔记整理&#xff0c;纯复习向&#xff0c;思维导图基本就是全部内容了&#xff0c;不会涉及较深的知识点~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画思维导图~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;…

【数值分析】2 - 插值法

文章目录 一、引言1.1 插值法引入1.2 常用插值法1.3 插值法定义 二、插值法研究的问题2.1 插值多项式存在的唯一性2.2 如何构造n次多项式2.2.1 待定系数法2.2.2 拉格朗日插值法2.2.2.1 拉格朗日多项式2.2.2.2 拉格朗日插值余项2.2.2.3 例题2.2.2.4 拉格朗日插值法的问题 2.2.3 …

【大疆智图】大疆智图(DJI Terra 3.0.0)安装及使用教程

大疆智图是一款以二维正射影像与三维模型重建为主的软件,同时提供二维多光谱重建、激光雷达点云处理、精细化巡检等功能。它能够将无人机采集的数据可视化,实时生成高精度、高质量三维模型,满足事故现场、工程监测、电力巡线等场景的展示与精确测量需求。 文章目录 1. 安装D…

shell学习脚本04(小滴课堂)

他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容&#xff1a; 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话&#xff1a; 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。

42907-2023 硅锭、硅块和硅片中非平衡载流子复合寿命的测试 非接触涡流感应法

1 范围 本文件描述了用非接触式涡流感应法测试太阳能电池用单晶硅锭、硅块和硅片中非平衡载流子复 合寿命的方法。 本文件适用于非平衡载流子复合寿命在0.1μs&#xff5e;10000 μs、电阻率在0.1 Ω cm&#xff5e;10000 Ω cm 的硅锭、硅块和硅片的测试。其中瞬态光电导衰…

Spring定时任务@Scheduled

在 Spring 框架中&#xff0c;可以使用定时任务来执行周期性或延迟执行的任务。Spring 提供了多种方式来配置和管理定时任务。有Java自带的java.util.Timer类&#xff0c;也有强大的调度器Quartz&#xff0c;还有SpringBoot自带的Scheduled。 在实际应用中&#xff0c;如果没有…

实际项目中如何进行问题排查

Linux自带 文本操作 文本查找 - grep文本分析 - awk文本处理 - sed文件操作 文件监听 - tail文件查找 - find网络和进程 网络接口 - ifconfig防火墙 - iptables -L路由表 - route -nnetstat其他常用 进程 ps -ef | grep java分区大小 df -h内存 free -m硬盘大小 fdisk -l | gr…