下一代Ajax技术 — Fetch的学习与使用

news2024/11/20 8:40:45

一、初识fetch

在这里插入图片描述

Fetch被称为下一代Ajax技术,采用Promise方式来处理数据。是一种简洁明了的API,比XMLHttpRequest更加简单易用。

XMLHttpRequest

我们先来看看使用纯XMLhttpRequest来实现一次简单ajax请求的代码:

//获取XMLHttpRequest实例对象
const xhr = new XMLHttpRequest();
//初始请求
xhr.open("get", "https://jsonplaceholder.typicode.com/users");
//发送数据
xhr.send();
//设置xhr请求状态修改回调
xhr.onreadystatechange = function () {
    //如果请求状态已完成时
    if (xhr.readyState === 4) {
        //如果响应状态码大于等于200并且小于300时
        if (xhr.status >= 200 && xhr.status < 300) {
            //请求成功
            console.log(JSON.parse(xhr.response));
        } else {
            //请求失败
            console.log("请求失败!");
        }
    }
};

请不要把XMLHttpRequest和Ajax弄混了,Ajax只是一种思想或者技术,而XMLHttpRequest是一个原生对象,可以使用他实现Ajax。

fetch

Fetch 是一个现代的概念,等同于 XMLHttpRequest。它提供了许多与 XMLHttpRequest 相同的功能,但被设计成更具可扩展性和高效性。
注意,Fetch是JavaScript提供的原生API,所以是可以直接使用的,我们同样使用fetch来请求上一个例子的接口:

fetch("https://jsonplaceholder.typicode.com/users")
  .then((res) => res.json())
  .then((data) => console.log(data));

可以看到,fetch是返回的Promise实例,可以直接进行链式调用,代码更加简单易懂,也可以使用async和await。

Axios

Axios中文官网
其实可以发现,fetch和axios的使用方法十分相似,因为Axios的浏览器端其实就是XMLHttpRequest结合Promise的封装结果。
因此,fetch其实是可以直接代替Axios来进行浏览器端发起请求的,直接用原生的!
在这里插入图片描述

二、fetch配置

既然说fetch可以代替axios,那么fetch肯定和axios一样,可以配置许多选项,来完成不同的请求,例如获取数据、修改数据、上传文件等等……

配置

Promise<Response> fetch(input[, init]);

第一个参数input是定义要获取的资源。这可能是:

  • 一个 USVString 字符串,包含要获取资源的 URL。一些浏览器会接受 blob: 和 data: 作为 schemes. 一个
  • Request 对象。 fetch方法还可以接受第二个参数(可选),作为配置对象,定制发出的 HTTP 请求。

第二个参数(init)是可选参数对象:

fetch(url, {
    method: "GET",//请求方法 默认get
    headers: {//配置请求头
        "Content-Type": "text/plain;charset=UTF-8"
    },
    body: data,//请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
    referrer: "about:client",// 一个 USVString 可以是 no-referrer、client 或一个 URL。默认是 client。
    referrerPolicy: "no-referrer-when-downgrade",//指定了 HTTP 头部 referer 字段的值。可能为以下值之一:no-referrer、 no-referrer-when-downgrade、origin、origin-when-cross-origin、 unsafe-url。
    mode: "cors",//请求的模式,如 cors、no-cors 或者 same-origin。
    credentials: "same-origin",// 请求的 credentials,如 omit、same-origin 或者 include。为了在当前域名内自动发送 cookie,必须提供这个选项。
    cache: "default",// 请求的 cache 模式:default、 no-store、 reload 、 no-cache、 force-cache 或者 only-if-cached。
    redirect: "follow",//可用的 redirect 模式:follow (自动重定向), error (如果产生重定向将自动终止并且抛出一个错误),或者 manual (手动处理重定向)。在 Chrome 中默认使用 follow(Chrome 47 之前的默认值是 manual)
    integrity: "",//包括请求的 subresource integrity 值(例如: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。
    keepalive: false,//而这个参数是在说,即使页面已经不在了,这个请求依然需要完成,因此浏览器会延长它的生存期。
    signal: undefined//配合AbortController完成请求中断操作
});

三、常用对象及方法

fetch()采用模块化设计,API 分散在多个对象上(Response 对象、Request 对象、Headers 对象),使得编写的代码更加合理,逻辑也更加清晰。

Request

Request MDN文档
前面说到fetch的第一个参数可以是一个Request对象。

var myRequest = new Request(input[, init]);

与fetch()的参数好像差不多。

实例方法

arrayBuffer()

Request 接口的 arrayBuffer() 方法读取请求体并将其作为一个 promise 返回,该 promise 将兑现一个 ArrayBuffer

const myArray = new Uint8Array(10);

const request = new Request('/myEndpoint', {
  method: 'POST',
  body: myArray
});

request.arrayBuffer().then(function(buffer) {
  // do something with the buffer sent in the request
});

blob()

Request 接口的 blob() 方法读取请求体并将其作为 promise 返回,该 promise 将兑现一个 Blob。

const obj = {hello: 'world'};
const myBlob = new Blob([JSON.stringify(obj, null, 2)], {type : 'application/json'});

const request = new Request('/myEndpoint', {
  method: 'POST',
  body: myBlob
 });

request.blob().then(function(myBlob) {
  // do something with the blob sent in the request
});

clone()

Request 接口中的clone() 方法可以创建一个当前Request 对象的副本。

formData

Request 接口的 formData() 方法读取请求体并将其作为 promise 返回,该 promise 将兑现一个 FormData 对象。

const formData = new FormData();
const fileField = document.querySelector('input[type="file"]');

formData.append('username', 'abc123');
formData.append('avatar', fileField.files[0]);

const request = new Request('/myEndpoint', {
  method: 'POST',
  body: formData
});

request.formData().then(function(data) {
  // do something with the formdata sent in the request
});

json()

Request 接口的 json() 方法读取请求体并将其作为一个 promise 返回,该 promise 将兑现一个由响应体的文本解析得到的 JSON。

注意,尽管方法被命名为 json(),结果并不是 JSON,而是将输入作为 JSON 解析,以生成一个 JavaScript 对象

返回一个将兑现一个 JavaScript 对象的 Promise。这个对象可能是任何可以用 JSON 表示的东西——一个对象、一个数组、一个字符串、一个数值……

const obj = {hello: 'world'};

const request = new Request('/myEndpoint', {
  method: 'POST',
  body: JSON.stringify(obj)
 });

request.json().then(function(data) {
  // do something with the data sent in the request
});

text()

Request 接口的 text() 方法读取请求体并且将其作为一个 promise 返回,该 promise 将兑现一个 String。响应总是使用 UTF-8 解码。

Response

你可以使用 Response.Response() 构造函数来创建一个 Response 对象,但通常更可能遇到的情况是,其他的 API 操作返回了一个 Response 对象。

let r = new Response(); 
console.log(r); 
// Response { 
// body: (...) 
// bodyUsed: false //包含了一个布尔值 (en-US)来标示该 Response 是否读取过 Body。
// headers: Headers {} //包含此 Response 所关联的 Headers 对象。
// ok: true //包含了一个布尔值,标示该 Response 成功(HTTP 状态码的范围在 200-299)。
// redirected: false //表示该 Response 是否来自一个重定向,如果是的话,它的 URL 列表将会有多个条目。
// status: 200 //包含 Response 的状态码(例如 200 表示成功)。
// statusText: "OK" //包含了与该 Response 状态码一致的状态信息(例如,OK 对应 200)。
// type: "default" //包含 Response 的类型(例如,basic、cors)。
// url: "" //包含 Response 的 URL。
// } 

静态方法

error()

Response 接口的 error() 方法返回一个包含网络错误相关信息的新 Response 对象。

redirect()

Response 接口的 redirect() 方法返回一个可以重定向到指定 URL 的 Response 。

var response = Response.redirect(url, status);

实例方法

arrayBuffer

Response上的方法 arrayBuffer() 接受一个 Response 流,并等待其读取完成。它返回一个 promise 实例,并 resolve 一个 ArrayBuffer 对象。

response.arrayBuffer().then(function(buffer) {
  // do something with buffer
)};

blob

Response mixin 的 **blob()**方法使用一个 Response 流,并将其读取完成。它返回一个使用Blob解决的 promise。

response.blob().then(function(myBlob) {
  // do something with myBlob
});

clone

Response 接口的 clone() 方法创建一个响应对象的克隆,这个对象在所有方面都是相同的,但是储存在不同的变量中。
如果响应体已经被使用,clone() 抛出 TypeError。事实上,clone() 存在的主要原因是允许 body 对象可以使用多次(当它们是一次性使用时)。

const image1 = document.querySelector('.img1');
const image2 = document.querySelector('.img2');

const myRequest = new Request('flowers.jpg');

fetch(myRequest).then((response) => {
  const response2 = response.clone();

  response.blob().then((myBlob) => {
    const objectURL = URL.createObjectURL(myBlob);
    image1.src = objectURL;
  });

  response2.blob().then((myBlob) => {
    const objectURL = URL.createObjectURL(myBlob);
    image2.src = objectURL;
  });
});

formData

Response 对象中的formData() 方法将 Response 对象中的所承载的数据流读取并封装成为一个对象,该方法将返回一个 Promise 对象,该对象将产生一个FormData 对象。

response.formData()
.then(function(formdata) {
  // do something with your formdata
});

json

Response mixin 的 json() 方法接收一个 Response 流,并将其读取完成。它返回一个 Promise,Promise 的解析 resolve 结果是将文本体解析为 JSON。

response.json().then(data => {
  // do something with your data
});

返回一个被解析为 JSON 格式的 promise 对象,这可以是任何可以由 JSON 表示的东西 - 一个 object,一个 array,一个 string,一个 number…

text

Response mixin 的 text() 方法提供了一个可供读取的“返回流”(Response stream),并将它读取完。它返回一个包含 USVString 对象(也就是文本)的 Promise 对象,返回结果的编码永远是 UTF-8。

response.text().then(function (text) {
  // do something with the text response
});

Headers

Fetch API 的 Headers 接口允许您对 HTTP 请求和响应头执行各种操作。这些操作包括检索,设置,添加和删除。一个 Headers 对象具有关联的头列表,它最初为空,由零个或多个键值对组成。

构造函数Headers()

var myHeaders = new Headers(init);

init 参数可选:通过一个包含任意 HTTP headers 的对象来预设你的 Headers. 可以是一个ByteString 对象; 或者是一个已存在的 Headers 对象。

append()

在一个Headers对象内部,Headers接口的 append() 方法可以追加一个新值到已存在的 headers 上,或者新增一个原本不存在的 header。

myHeaders.append(name,value);

delete()

delete() 方法可以从 Headers 对象中删除指定 header.
下列原因将会导致该方法抛出一个TypeError:

  1. header 名在 HTTP header 中是不存在的。
  2. header 被锁定了。
myHeaders.delete(name);

entries()

Headers.entries() 以 迭代器 的形式返回 Headers 对象中所有的键值对。

// Create a test Headers object
var myHeaders = new Headers();
myHeaders.append('Content-Type', 'text/xml');
myHeaders.append('Vary', 'Accept-Language');

// Display the key/value pairs
for (var pair of myHeaders.entries()) {
   console.log(pair[0]+ ': '+ pair[1]);
}

forEach()

和遍历数组的forEach方法类似。

// Create a new test Headers object
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Cookie", "This is a demo cookie");
myHeaders.append("compression", "gzip");

// Display the key/value pairs
myHeaders.forEach((value, key) => {
  console.log(`${key} ==> ${value}`);
})

返回

compression ==> gzip
content-type ==> application/json
cookie ==> This is a demo cookie

get()

获取指定headers属性的值。

const myHeaders = new Headers(); // Currently empty
myHeaders.get('Not-Set'); // Returns null

has()

Headers 接口的 **has()**方法返回一个布尔值来声明一个 Headers对象 是否包含特定的头信息。

myHeaders.append('Content-Type', 'image/jpeg');
myHeaders.has('Content-Type'); // Returns true
myHeaders.has('Accept-Encoding'); // Returns false

keys()

eaders.keys() 方法返回一个 headers(Object) 对象所有 key 组成的迭代器,通过迭代器可以遍历 headers 这个对象,返回的迭代器中的元素 key 都是字符串。

// 创建一个 Headers 对象
var myHeaders = new Headers();
myHeaders.append('Content-Type', 'text/xml');
myHeaders.append('Vary', 'Accept-Language');

// 显示 Headers 中所有的 key
for(var key of myHeaders.keys()) {
   console.log(key);
}

set()

Headers.set 和 append() 两者之间的不同之处在于当指定 header 是已经存在的并且允许接收多个值时,Headers.set会重写此值为新值,而append()会追加到值序列的尾部

myHeaders.set('Accept-Encoding', 'deflate');
myHeaders.set('Accept-Encoding', 'gzip');
myHeaders.get('Accept-Encoding'); // Returns 'gzip'

values()

Headers.values() 方法返回一个可迭代数值,通过这个数值可以遍历 Headers 中键值对的 value 值。返回的 value 都是 ByteString 对象。

// Create a test Headers object
var myHeaders = new Headers();
myHeaders.append('Content-Type', 'text/xml');
myHeaders.append('Vary', 'Accept-Language');

// Display the values
for (var value of myHeaders.values()) {
   console.log(value);
}
text/xml
Accept-Language

以上内容全部参考于mdn web docs - Fetch API

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

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

相关文章

TypeScript(三)面向对象

TypeScript 类的定义 我们可以使用class关键字来定义一个类&#xff1b; 我们可以声明类的属性&#xff1a;在类的内部声明类的属性以及对应的类型 如果类型没有声明&#xff0c;那么它们默认是any的&#xff1b; 我们也可以给属性设置初始化值&#xff1b; 在默认的strictPr…

MSG企业行·AI+医疗专场成功举办!!昇思MindSpore助力智慧医疗深度发展!

【MSG企业行AI医疗】 11月19日下午&#xff0c;【MSG企业行AI医疗】线上交流会成功举办&#xff01; 昇思MindSpore开源社区联合大连人工智能生态创新中心、深圳大学、武汉理工大学、摩赛恩科技、连心医疗、众享未来融合研究院&#xff0c;邀请到了5人工智能与医疗行业嘉宾&a…

利用navicat定时传输数据到另一个库

需求&#xff1a;每天定时6点&#xff0c;12点&#xff0c;18点将SQLserver的数据推送到mysql库中 之前就看到navicat有个自动运行&#xff08;有的版本叫计划&#xff09;&#xff0c;但是不会用&#xff0c;刚好趁这个机会学一学 提前说一点&#xff0c;可能需要先换成admin…

antd:ConfigProvider+getPopupContainer解决筛选框遮挡问题(及其他浮层问题)

一. 问题场景二. 解决方案三. 代码示例一. 问题场景 当表格高度太低&#xff08;下图业务场景出现在数据条数太少时&#xff09;&#xff0c;column中有筛选框&#xff0c;可能会出现筛选框被遮挡的问题&#xff1a; 这是因为filter的下拉菜单渲染在table的表头栏&#xff0…

运算放大器的理解与应用

运算放大器的理解与应用 运算放大器简称运放&#xff0c;由于早期应用于模拟计算机中&#xff0c;用以实现数学运算&#xff0c;故得名“运算放大器”。主要是用在模拟电路中&#xff0c;比如放大器、比较器、模拟运算器&#xff0c;是电子工程师经常要用到的器件。运算放大器…

145646-22-6|表位肽EQKLISEEDL

c-Myc Peptide Trifluoroacetate 是一种合成肽&#xff0c;与人 c-myc 蛋白的 C-末端氨基酸 (410-419) 相对应&#xff0c;参与调控与生长有关的基因的转录过程。c-Myc Peptide Trifluoroacetate is a synthetic peptide corresponding to the C-terminal amino acids (410-419…

开源共建 | 中国移动冯江涛:ChunJun(原FlinkX)在数据入湖中的应用

ChunJun&#xff08;原FlinkX&#xff09;是一个基于 Flink 提供易用、稳定、高效的批流统一的数据集成工具。2018年4月&#xff0c;秉承着开源共享的理念&#xff0c;数栈技术团队在github上开源了FlinkX&#xff0c;承蒙各位开发者的合作共建&#xff0c;FlinkX得到了快速发展…

Spring Security验证码配置化开发

背景 在前两篇文章中给大家介绍了Spring Security的认证流程&#xff0c;包含对项目的定制化处理&#xff0c;可以明白security的设计还是比较强大的&#xff0c;通过一系列的过滤器注册的过滤器链&#xff0c;对流程进行链式的处理。 今天介绍一种以配置器的方式处理验证码生…

Day11--配置tabBar效果

1.创建tabBar分支 我的操作&#xff1a; 1》在其根路径下按住“shift”和鼠标右键进入powerShell界面&#xff0c;然后输入创建一个分支tabBar. ****************************** ****************************** ****************************** ****************** 2.创建ta…

生产质量管理系统有哪些功能?

随着中国市场经济的快速发展&#xff0c;中国产品正经历着“中国制造”向“中国创造”的转变,在这个过程中&#xff0c;企业经营也逐渐从低成本生产管理向质量经营方向发展&#xff0c;企业已经认识到质量的重要性&#xff0c;企业对质量管理的有效性也提出了更高的要求。 作为…

【Servlet】5:详解响应对象 HttpServletResponse

目录 | 响应对象 HttpServletResponse接口 HttpServletResponse的基本概述 响应对象返回 String 给Browser & 中文乱码问题 响应对象返回 int 给Browser 响应对象 解析HTML标签后 返回给Browser 本文章属于后端全套笔记的第三部分 &#xff08;更新中&#xff09;【后…

UI和UI有什么不同,是如何协助的

UX(用户体验)和UI&#xff08;用户界面&#xff09;是一个常用的术语。然而&#xff0c;尽管有复杂的联系&#xff0c;但网页设计的两个领域是两个不同的东西。事实上&#xff0c;有可能有一个用户界面优秀但用户体验差的网站。因此&#xff0c;了解UX和UI良好的网页设计非常重…

只需要改造一下实体类,以后再也不用写SQL了

文章目录只需要改造一下实体类&#xff0c;以后再也不用写SQL了 现状分析现状示例1. 建立人员表M.T.Person表&#xff0c;包含三个字段名称&#xff0c;年龄&#xff0c;身份证。2. 新增一条数据&#xff0c;也就是插入的情况。3. 获取单条数据内容&#xff0c;也是就是根据ID获…

经济师十大专业通过人数分析!选专业有谱了!

最近&#xff0c;很多同学在后台咨询&#xff0c;哪个专业的好通过&#xff0c;自己要如何选专业…… 小编特别整理了已经公布的各省市2021年初、中级经济师各专业通过情况数据&#xff0c;给大家参考&#xff01; 2022年中级经济专业技术资格考试设《经济基础知识》和《专业知…

让学前端不再害怕英语单词(三)

前两章直通车↓↓↓ 让学前端不再害怕英语单词&#xff08;一&#xff09; 让学前端不再害怕英语单词&#xff08;二&#xff09; 由于前两章都反响强烈&#xff0c;都上了全站的热榜&#xff0c;所以今天打算把第三章也写出来 第三章我们主要讲一下css中的伪类的英语单词还有…

TResNet: ResNet改进,实现高精度的同时保持高 GPU 利用率

终于开题&#xff0c;抓紧发文&#xff0c;然后放飞​​​​​​&#xff0c;来由就是想搞一篇论文&#xff0c;但是增加了某个东西之后吧&#xff0c;速度变慢了&#xff0c;所以导师提议加个这玩意看看能不能快点。 论文题目&#xff1a;TResNet: High Performance GPU-Dedi…

深度剖析商业智能BI中的多维分析

数据在这些年的时间中&#xff0c;也逐渐成长为了个人、机构、企业乃至国家的战略资源&#xff0c;被很多人放到“新时代的石油”这一位置上。虽然这个说法也引起了一些争议&#xff0c;但更多只是讨论数据和石油的差异性&#xff0c;却并没有多少人否认数据的价值&#xff0c;…

开发速查表,一个值得每个程序员收藏的网站

在工作过程中&#xff0c;虽然我们程序员&#xff0c;主要是使用一门语言开发&#xff0c;但免不了会用到其他语言参与其他项目&#xff1b;或者很多全栈工程师&#xff0c;会参与前端的开发调试&#xff1b;总的来说&#xff0c;我们工作过程中&#xff0c;都会涉及到多门编程…

Fluent 嵌套网格(overset)功能讲解与实例操作

作者 | 张杨 在流体仿真中&#xff0c;我们经常会遇到边界运动的问题&#xff0c;如&#xff1a; 生物医疗行业中血管的运动 航空航天行业中飞行器的分离 容积泵中齿轮的相对运动 在ANSYS Fluent 17.0之前的版本中&#xff0c;我们通常采用传统的MDM&#xff08;Moving/D…

【模型训练】YOLOv7车辆和行人检测

YOLOv7车辆和行人检测 1、车辆和行人检测模型训练2、模型评估3、模型和数据集下载网盘链接1、本项目采用YOLOv7算法实现对车辆和行人检测,在几千多张车辆和行人检测中能训练得到,我们训练了YOLOv7、,所有指标都是在同一个验证集上得到; 2、目标类别数:2 ;类别名:person、…