JavaScript前端面试题——fetch

news2024/12/22 20:33:10

什么是fetch?

fetch:fetch是浏览器内置的api,用于发送网络请求

ajax&axios&fetch的关系

ajaxajax 是一种基于原生 JavaScript 的异步请求技术。它使用 XMLHttpRequest 对象来发送请求和接收响应。

axiosaxios 是一个基于 Promise 的 HTTP 客户端,可以在浏览器和 Node.js 中使用。它提供了更高级别的封装,使发送请求和处理响应更加简单和灵活。

fetchfetch 是浏览器内置的 API,用于发送网络请求。它提供了一种现代化、基于 Promise 的方式来进行网络通信。用法和axios类似,但相比于 axios,它的功能和封装级别更为简单。

我之前一直以为AJAX和axios是同一个东西,现在才发现并不是

axios是一个独立的第三方库,用法简单,功能强大,所以开发时常用的是axios

而学习AJAX则是帮我们去理解请求的底层原理,可以说:axios内部封装了AJAX

而fetch的应用场景呢?——基本上只在面试中会遇到哈哈哈哈哈哈哈哈。但如果一个项目中只用到了一两个请求,这时候把axios引进来就有点小题大做了,所以这时候也可以考虑用fetch

fetch核心语法

mdn官网:Window:fetch() 方法 - Web API | MDN (mozilla.org)

Window 接口的 fetch() 方法用于发起获取资源的请求,它会返回一个会在请求响应后兑现的 promise -> 返回的是promise对象,所以可以用.then,可以await,async。通常需要用await来等待返回的promise对象

该 promise 会兑现一个表示请求响应的 Response 对象 -> Response - Web API | MDN (mozilla.org)

在请求返回的response对象中,比较常用的属性是status,也就是响应状态码

Response 实现了 Body 接口,所以以下方法同样可用,比较常用的是.json()方法,该方法可以拿到服务器返回的数据,该方法返回的也是一个promise对象,所以也需要用await来等待

下面是一个fetch请求示例

接下来我们用fetch请求来实现获取地区列表的需求

案例中我们将用到这个测试接口:

 通过接口文档我们可以写出如下代码

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>fetch核心语法</title>
</head>

<body>
  <h2>fetch核心语法</h2>
  <button class="btn">测试</button>
  <script>
    document.querySelector('.btn').addEventListener('click', async () => {


      const p = new URLSearchParams({ pname: '广东省', cname: '深圳市' })
      // 1.如何发请求? 默认是get方法,参数1 url地址,返回的Promise
      const res = await fetch('http://hmajax.itheima.net/api/area?' + p.toString())
      // const res = await fetch('http://hmajax.itheima.net/api/area1234')
      // console.log(res)

      if (res.status >= 200 && res.status < 300) {
        // 2.如何处理响应(JSON)? .json方法解析json.返回Promise
        const data = await res.json()
        console.log(data)
      } else {
        // 3.如何处理异常?
        console.log('请求异常', res.status)
      }
    })    
  </script>
</body>

</html>

 该代码实现的功能是点击“测试”按钮,控制台将会打印服务器返回的数据(也就是打印广东省深圳市的地区列表)

代码解释

一般在 GET 请求中,在 HTTP 请求中,需携带URL 查询参数,URL 查询参数是指在 URL 中通过 ? 后面附加的键值对形式的数据,用于向服务器传递额外的信息。查询参数以 key=value 的形式组成,多个参数之间使用 & 符号分隔。

例如,在以下 URL 中的查询参数是 pname=广东省&cname=深圳市

http://hmajax.itheima.net/api/area?pname=广东省&cname=深圳市

  • new URLSearchParams({...}):这是 JavaScript 中的一个内置类,用于处理 URL 查询参数。传入一个对象 { pname: '广东省', cname: '深圳市' } 作为参数,该对象的键值对将被转换为 URL 查询参数的形式。
  • p:是一个 URLSearchParams 对象的实例,它包含了参数 pname=广东省&cname=深圳市

 上述代码是为了让大家了解new URLSearchParams({...})这个内部类,而为了简化代码,我们可以直接将上述代码写成下面这样

如果你想让代码看起来更加简短,可以不用变量来接收请求返回的promise对象,我们可以直接通过.then的链式结构来处理所有逻辑,代码如下,这段代码的逻辑和实现的功能和上面的代码是一样的,只是写法不同。只不过为了使代码便于理解,通常还是使用await,async

为什么我们要学fetch?

博客写到这里,我心里的一个疑问突然有了解答——为什么我们要学fetch?只是为了面试吗?

说实话,我是真不理解我们为什么要学fetch,我学完了前端三件套,学完了vue,学完了axios,甚至还写了两个项目。对fetch一无所知,但是丝毫不影响我写项目,如果不是要准备面试,我甚至怀疑我一辈子都不会去学fetch。那么面试为什么要问这种实际工作中根本没啥实际用途的八股文?我实在是不能理解

但今天,我突然回想起之前我和一个后端队友合作了一个英语口语项目,那次合作很失败。因为我只懂前端,他只懂后端,我俩在沟通上存在很大的障碍。后来他用AI给我生成了一份请求demo,但奈何这demo是用fetch写的,我当时根本不知道除了axios之外还有这种请求方式,所以demo看得也很吃力

而接口文档上得代码示例其实也是用fetch写的,如果不学的话,还真的看不懂

最后再来个综上所述,哈哈哈哈哈哈哈哈哈哈哈,所以学fetch还是有点用的,不止面试

提交FormData

下面是请求提交FormData的基本格式,因为fetch请求默认提交FormData,所以不需要设置请求头(请求头的作用是告诉服务器请求体的数据格式)

接下来我们实现一个需求:上传图片及图片回显,调用的接口如下上传-图片 - AJAX阶段 (apifox.com)

代码如下,注释写得很详细,相信聪明的你们一定能看懂

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>fetch提交FormData</title>
</head>

<body>
  <h2>fetch提交FormData</h2>
  <!-- 选择图片 -->
  <input type="file" class="ipt">
  <!-- 图片回显 -->
  <img class="icon" src="" alt="">
  <script>
    /**
     * fetch提交FormData
     *  1.如何设置请求方法?
     *  2.如何提交数据?
     * */
    document.querySelector('.ipt').addEventListener('change', async function () {
      const img = this.files[0] //获取用户上传的文件对象
      const data = new FormData() //创建formdata对象
      data.append('img', img) //以键值对的方式往对象里追加
      // console.log(img)
      // 1.如何设置请求方法?
      // 2.如何提交数据?
      const res = await fetch('http://hmajax.itheima.net/api/uploadimg', {
        // 请求方法
        method: 'post',
        // 提交的数据
        body: data
      })
      const resData = await res.json() //resData中包含了服务器返回的图片路径
      console.log(resData)

      // 回显
      document.querySelector('.icon').src = resData.data.url //将图片路径设置给图片标签的src属性,实现回显功能
    })
  </script>
</body>

</html>

浏览器运行效果是这样的

提交JSON

因为fetch请求默认提交FormData,所以提交JSON格式的数据需要先设置请求头

其次,因为body的数据需要提交JSON格式的数据,而且fetch不像axios,axios的请求体数据默认是JSON格式,但fetch不是,所以请求体的内容需要用JSON.stringfy转化为JSON

接下来我们实现注册账号的需求,需要用到如下接口:注册账号 - AJAX阶段 (apifox.com)

 代码如下

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>fetch提交JSON</title>
</head>

<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,
        // JSON.stringify 对象-->JSON
        body: JSON.stringify({
          username: 'itheima666',
          password: '123456'
        })
      })
      // res.status 判断状态码
      const data = await res.json()
      console.log(data)
    })
  </script>
</body>

</html>

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

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

相关文章

MP4标准格式深度解析

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

校园选课助手【1】-项目整体架构从此开始

项目背景 随着高校招生规模的不断扩大&#xff0c;学生选课需求日益增长。为提高选课效率&#xff0c;降低学生选课压力&#xff0c;本项目旨在开发一款校园选课助手软件。 项目目标:开发一款具有以下特点的校园选课助手软件&#xff1a; 易用性&#xff1a;界面简洁&#xff…

微信-公众号/订阅号推送消息(js版本)

1.登录或注册微信测试号 &#xff08;测试号的名称由官方自动生成&#xff0c;不能更改&#xff09; 微信测试号入口&#xff1a;微信公众平台 ​ 2.登录进去后会看到自己的appId和appsecret &#xff08;这两个参数都需填入代码中&#xff09; ​ 3.检查是否安装nodeJs…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-3-启动浏览器(详细教程)

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 通过前边两篇文章跟随宏哥学习想必到这里已经将环境搭建好了&#xff0c;今天就在Java项目搭建环境中简单地实践一下&#xff1a; 启动两大浏览器。按市场份额来说&#xff0c…

[极客大挑战 2019]BuyFlag1

这个题目比较常规&#xff0c;算是我遇到的简单题&#xff0c;也是这段时间第一个独立解出的&#xff0c;有点小开心。 首先打开靶机&#xff0c;一个平平无奇的纳新页面&#xff0c;很容易找到 /pay.php 看一下pay.php 这里说了几个条件&#xff1a;需要100000000&#xff0c…

【iOS】copystrong原理+深浅拷贝+完全拷贝

Copy&Strong原理 Copy探究 在回答copy的各种问题前&#xff0c;我们需要先了解我们为什么要使用copy。 拷贝的目的 &#xff1a; 产生一个副本对象&#xff0c;跟源对象互不影响 修改了源对象&#xff0c;不会影响副本对象修改了副本对象&#xff0c;不会影响源对象 iOS…

量化方法怎么选?如何评估量化后的大模型LLM?

文章内容总结自&#xff1a;Evaluating Quantized Large Language Models&#xff08;https://arxiv.org/abs/2402.18158&#xff09; 如果想深入了解量化的基本概念和如何用代码实现请参考&#xff1a; Michael&#xff1a;用python代码深入浅出量化概念 &#xff08;https…

YOLOv10改进 | 注意力篇 | YOLOv10引入SpatialGroupEnhance注意力机制,并构建C2f_SGE

1. SGE介绍 1.1 摘要:卷积神经网络(CNN)通过收集语义子特征的层次和不同部分来生成复杂对象的特征表示。这些子特征通常可以以分组的形式分布在每层的特征向量中[43,32],代表各种语义实体。然而,这些子特征的激活通常在空间上受到相似模式和噪声背景的影响,从而导致错误…

虚拟机win server安装配置DNS服务器

准备工作 创建DNS服务器前将自己的网卡地址设置为静态IP&#xff0c;选择自己的网卡。因为本机作为DNS服务器所以将DNS服务器地址设为了自己的回环地址。 一、使用服务器管理安装 DNS 服务器 1、登录服务器后&#xff0c;服务器会默认启用“服务器管理”页面&#xff0c;选择…

提前批测开三面,已OC!

大家好&#xff0c;我是洋子 近期百度提前批已经开始有一段时间了&#xff0c;甚至已经有不少 25 届的同学 oc 了&#xff0c;这里分享一位已经顺利 oc 百度提前批测开岗位同学的三轮面试面经 整个三轮技术面试总体难度不高&#xff0c;但考察知识广度比较广&#xff0c;如果…

搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(含代码示例)

引言 随着物联网&#xff08;IoT&#xff09;技术的快速发展&#xff0c;基于 STM32 的服务器&#xff08;类似网关&#xff09;在数据采集、设备控制等方面的应用越来越广泛。本文将介绍搭建一个基于 STM32 的服务器所需的技术栈&#xff0c;以及详细的搭建步骤和代码示例。 …

好的养宠空气净化器是智商税吗?好的养宠空气净化器用户体验

家里养了两只“超级掉毛怪”,家里的猫毛满天飞&#xff0c;衣服床餐具等到处都是&#xff01;感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落&#xff0c;多猫拉臭传来的异味。 一、养猫需要解决的问题 掉毛&#…

Tsan-ThreadSanitizer之As if synchronized via sleep

最近在调试ffmpeg的时候&#xff0c;加入了tsan&#xff0c;结果出现了下面提示&#xff1a; 具体什么意思呢&#xff0c;找了很久找到了官方介绍&#xff1a; https://github.com/google/sanitizers/wiki/ThreadSanitizerReportFormat

大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Git的一些简单使用

下列内容适用于git初学者&#xff0c;从创建本地git仓库到提交的一个基本过程1. 1.创建git仓库 在想创建git仓库的路径下打开git bash&#xff0c;输入以下命令行创建仓库&#xff08;一般来说&#xff0c;我觉得直接在code workspace得地方创建git仓库就可以了&#xff0c;这…

acme.sh生成https证书

前言 SSL 价格并不便宜, 本节介绍如何使用 acme.sh 生成免费的 SSL 证书 证书生成原理 CA && Let’s Encrypt 证书颁发机构&#xff08;CA&#xff0c;Certificate Authority&#xff09;是一个负责颁发数字证书的实体。数字证书用于在互联网上验证实体的身份&…

注册或购买的谷歌账号的辅助邮箱是否需要设置?有什么用?设置的要点是什么?

今天早上&#xff0c;有个朋友联系到GG账号服务&#xff0c;问我谷歌账号辅助邮箱怎么用。说实在的这个问题有点抽象&#xff0c;哈哈。 然后我详细了解了一下&#xff0c;原来是这样的&#xff1a; 他的谷歌账号提示异常&#xff08;这个时候账号肯定是被停用了的&#xff09…

【Linux应用编程】Day12线程

线程 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制&#xff0c;线程参与系统调度&#xff1b; 事实上&#xff0c;系统调度的最小单元是线程、而并非进程。 ⚫ 线程的基本概念&#xff0c;线程 VS 进程&#xff1b; ⚫ 线程标识&#xff1b; ⚫ 线…

电脑上有什么好用的记笔记软件吗?试试这3款笔记软件,功能丰富又实用

笔记软件千千万&#xff0c;日常使用方便最关键&#xff01;&#xff01; 推荐3个各有亮点的笔记软件&#xff0c;不止是记笔记这么简单&#xff1a; 1、FlowUs 推荐指数&#xff1a;☆☆☆☆☆ 关键词&#xff1a;文档笔记软件 下载链接>>flowus.cn FlowUs是一款在…

ADI - 通过5 V至24 V输入提供双极性、双向DC-DC流入和流出电流

大部分电子系统都依赖于正电压轨或负电压轨&#xff0c;但是有些应用要求单电压轨同时为正负电压轨。在这种情况下&#xff0c;正电源或负电源由同一端子提供&#xff0c;也就是说&#xff0c;电源的输出电压可以在整个电压范围内调节&#xff0c;并且可以平稳转换极性。例如&a…