当前位置: 首页 > 编程日记 > 正文

Fetch 入门

一、什么是Fetch ?

Fetch的定义

Fetch本质上是一种标准,该标准定义了请求、响应和绑定的流程。 Fetch标准还定义了Fetch () JavaScript API,它在相当低的抽象级别上公开了大部分网络功能,我们今天讲的主要是Fetch API。Fetch API 提供了一个获取资源的接口(包括跨域)。它类似于 XMLHttpRequest ,但新的API提供了更强大和灵活的功能集。 Fetch 的核心在于对 HTTP 接口的抽象,包括 Request,Response,Headers,Body,以及用于初始化异步请求的 global fetch。

二、如何使用Fetch

fetch() 方法的使用

Fetch API 提供了一种全局fetch()方法,该方法位于 WorkerOrGlobalScope 这一个 mixin 中 方法用于发起获取资源的请求。它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象。

fetch(input?: Request | string, init?: RequestInit): Promise<Response>fetch(url, options).then(function(response) {// 处理 HTTP 响应
}, function(error) {// 处理网络错误
})
复制代码

fetch() 参数

fetch方法可以接收两个参数input和options。

  • input 参数可以是字符串,包含要获取资源的 URL。也可以是一个 Request 对象。

  • options 是一个可选参数。一个配置项对象,包括所有对请求的设置。可选的参数有:

method: 请求使用的方法,如 GET、POST。
headers: 请求的头信息,包含与请求关联的Headers对象。
body: 请求的 body 信息。注意 GET 或 HEAD 方法的请求不能包含 body 信息
mode: 请求的模式,如 cors、 no-cors 或者 same-origin。
credentials: 请求的 credentials,如 omit、same-origin 或者 include。为了在当前域名内自动发送 cookie , 必须提供这个选项。

常用的fetch请求

HTML

fetch('/index/fetchHtml').then((res) => {return res.text()}).then((result) => {document.body.innerHTML += result}).catch((err) => {})
复制代码

JSON

fetch('/api/user/CaiCai').then((res) => {return res.json()}).then((json) => {console.log(json)}).catch((err => {}))复制代码

POST Form

function postForm() {const form = document.querySelector('form')const name = encodeURI(document.getElementsByName('name')[0].value)fetch(`/api/user/${name}`, {method: 'POST',body: new FormData(form)})
}
复制代码

POST JSON

fetch('/api/user/CaiCai', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({name: 'CaiCai',age: '26',})
})复制代码

fetch注意事项

1. 错误处理

fetch只有在网络错误的情况,返回的promise会被reject。成功的 fetch() 检查不仅要包括 promise 被 resolve,还要包括 Response.ok 属性为 true。HTTP 404 状态并不被认为是网络错误,所以Promise的状态为resolve。

2. credentials 设置

fetch可以通过credentials自己控制发送请求时是否带上cookie。credentials可设置为include、same-origin、omit。include为了让浏览器发送包含凭据的请求(即使是跨域源)。如果你只想在请求URL与调用脚本位于同一起源处时发送凭据,请添加credentials: 'same-origin'。要改为确保浏览器不在请求中包含凭据,请使用credentials: 'omit'。

credentials 默认是“same-origin”,但是以下版本的浏览器实现了一个更老版本的fetch规范,其中默认是“忽略”: Firefox 39-60 Chrome 42 - 67 Safari 10.1 11.1.2 如果您的目标是这些浏览器,建议始终对所有fetch请求显式指定凭据:'同源',而不是依赖于默认

3. 中止

fetch 自身并没有提供 中止请求的方法。但是部分浏览器有实现AbortController,可以通过AbortController中止fetch请求

const controller = new AbortController();
const signal = controller.signal;
setTimeout(() => controller.abort(), 5000);fetch('/api/user/CaiCai', {signal, // 在option中加入signalmethod: 'POST',// credentials:'include',headers: {'Content-Type': 'application/json'},body: JSON.stringify({name: 'CaiCai',age: '26',})
}).then((res) => {return res.json()
}).then((result) => {console.log(result)
}).catch((err) => {console.log(err)
})复制代码

4.兼容性

以下Can I Use上显示的,是fetch的兼容性情况,目前已经支持大部分浏览器,不支持的浏览器可以使用fetch polyfill

三、为什么要用Fetch、而不用XHR

1、fetch返回的是promise对象,比XMLHttpRequest的实现更简洁,fetch 使用起来更简洁 ,完成工作所需的实际代码量也更少
2、fetch 可自定义是否携带Cookie
3、fetch在ServiceWorker中使用,至于ServiceWorker能有什么优势,会在未来写ServiceWorker的时候回写到

四、为什么放弃fetch

首先,谢谢各位同学的指出文章的中问题,标题确实欠妥,文不对题。这里补充下fetch的一些问题:
1.fetch不支持jsonp,如果项目中使用到JSONP,需要单独实现一个JSONP。
2.fetch自身并没有提供abort的方法,需要AbortController去处理中止,实现起来会繁琐一点。并且AbortController兼容性不是很好,不过@周公来同学指出,我们可以使用“abortcontroller-polyfill”。
3.在我们平常使用中,fetch相对XHR差别不大,并且就像@jokerapi同学说的“实际业务上,api 请求都是用再次封装好的函数来处理的。底层是 Fetch 还是 XHR 影响不大。”。所以如果没有特别的需求,从XHR升级到fetch的意义不大。但是在ServiceWorker中fetch会大放异彩。目前淘宝首页就使用fetch+ServiceWorker来实现离线缓存。

参考链接:

Fetch API
开始学习Fetch
浅谈 Fetch
fetch polyfill

相关文章:

保障数据安全,强调科技向善,旷视发布《人工智能应用准则》

目录 AI应用落地加速 善用科技是关键 《人工智能应用准则》全文 2019年7月17日&#xff0c;旷视正式全文公布基于企业自身管理标准的《人工智能应用准则》&#xff08;以下简称《准则》&#xff09;。《准则》从正当性、人的监督、技术可靠性和安全性、公平和多样性、问责和及…

胜者树和败者树 - qianye0905 - 博客园

胜者树和败者树 - qianye0905 - 博客园胜者树和败者树胜者树和败者树都是完全二叉树&#xff0c;是树形选择排序的一种变型。每个叶子结点相当于一个选手&#xff0c;每个中间结点相当于一场比赛&#xff0c;每一层相当于一轮比赛。不同的是&#xff0c;胜者树的中间结点记录的…

C/C++代码静态检查工具PC-lint在VS2008开发环境中的安装配置和使用

PC-Lint偏重于代码的逻辑分析&#xff0c;它能够发现代码中潜在的错误&#xff0c;比如数组访问越界、内存泄漏、使用未初始化变量等。 1、 从http://download.csdn.net/detail/liuchang5/3005191 下载破解版PC-lint9.0&#xff1b; 2、 解压缩到D:\soft\PC-lint&#xff0c…

k8s使用kube-router网络插件并监控流量状态

简介 kube-router是一个新的k8s的网络插件&#xff0c;使用lvs做服务的代理及负 载均衡&#xff0c;使用iptables来做网络的隔离策略。部署简单&#xff0c;只需要在每个节点部署一个daemonset即可&#xff0c;高性能&#xff0c;易维护。支持pod间通信&#xff0c;以及服务的代…

作业盒子完成1.5亿美元D轮融资,更名“小盒科技”

作者 | 夕颜 导读&#xff1a;2019 年 7 月 18 日&#xff0c;AI 在线教育创企“作业盒子”召开发布会&#xff0c;宣布已于今年 5 月完成 1.5 亿美元 D 轮融资&#xff0c;由阿里巴巴领投。同时&#xff0c;“作业盒子”宣布进行品牌升级&#xff0c;正式更名为“小盒科技”&a…

8500WN流畅高速上网高端卡 12核心不锁倍频

据台湾媒体最新报道&#xff0c;台湾无线网卡厂商最新推出一款大功率80DBI无线网卡-横空出世8500WN集成机。售价约1180新台币(折合人民币约298元) 台湾卡王是全球著名的大功率无线网卡生产厂商&#xff0c;2007年曾最早推出大功率无线网卡8G&#xff0c;以其卓越的品质&#xf…

Fiddler抓包工具总结(转)

序章 Fiddler是一个蛮好用的抓包工具&#xff0c;可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。也可以用来检测网络安全。反正好处多多&#xff0c;举之不尽呀&#xff01;当年学习的时候也蛮费劲&#xff0c;一些蛮实用隐藏的小功能用了之后就忘记了&a…

Windows 64位机上C/C++代码静态检查工具Logiscope RuleChecker的安装和使用

1、 从http://download.csdn.net/detail/zmywly/3611820 和 http://download.csdn.net/detail/zmywly/3611854下载破解版&#xff1b; 2、 将文件解压缩到D:\soft\logiScope文件夹下&#xff0c;会生成一个logiScope[6.1.30]文件夹&#xff1b; 3、 双击D:\soft\lo…

作业盒子完成1.5亿美元D轮融资,用AI普及教育资源

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;2019 年 7 月 18 日&#xff0c;AI 在线教育创企“作业盒子”召开发布会&#xff0c;宣布已于今年 5 月完成 1.5 亿美元 D 轮融资&#xff0c;由阿里巴巴领投。同时&#xff0c;“作业盒子…

迭代器接口IteratorAggregate 与类 ArrayIterator(转)

也许你很想使用foreach来遍历一个类中的属性&#xff0c;然而你却没有很好的方式来这么做。可能使用PHP中class的操作的方式能够帮助你实现一些&#xff0c;但是现在我想你有了更好的方式。通过继承接口&#xff1a;IteratorAggregate来实现。 示例 [php] view plaincopy <?…

整理《Mastering OpenCV with Practical Computer Vision Projects》中第8章用Eigenfaces或Fisherfaces进行人脸识别操作流程

These generally involve four main steps&#xff1a;(1)、Face detection&#xff1b;(2)、Face preprocessing&#xff1b;(3)、Collect and learn faces&#xff1b;(4)、Face recognition. 一、Face detection(Haar-based、LBP-based) LBP-based detectors are potential…

性能比GPU高100倍!华人教授研发全球首个可编程忆阻器AI计算机

译者 | 陆离责编 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;密歇根大学研发成功第一台可编程的忆阻器计算机&#xff0c;它不仅是一个通过外部计算机运行的忆阻器阵列&#xff0c;而且还是可以在智能手机等小型设备上进行…

深入解析redis cluster gossip机制

社区版redis cluster是一个P2P无中心节点的集群架构&#xff0c;依靠gossip协议传播协同自动化修复集群的状态。本文将深入redis cluster gossip协议的细节&#xff0c;剖析redis cluster gossip协议机制如何运转。协议解析 cluster gossip协议定义在在ClusterMsg这个结构中&am…

Python 3.8即将发布,这几个变化你必须知道

作者 | Jake Edge译者 | Rachel出品 | Python大本营&#xff08;ID:pythonnews&#xff09;【导读】近日&#xff0c; Python 3.8.0b1 版本和 beta 版相继发布&#xff0c; Python 3.8 版的新特征已经基本成型。尽管最终版本的官方发布时间为 10 月&#xff0c;但实际上&#x…

Ubuntu 12.10 拨号上网及停用方法

2019独角兽企业重金招聘Python工程师标准>>> 本人电脑在设置了拨号上网过后&#xff0c;本来原先插上网线就能上网&#xff0c;现在反而不能上了&#xff0c;在网上找了些办法&#xff0c;再进行了些修改&#xff0c;最后成功了&#xff0c;现在把我的方法给大家分享…

011:视图函数介绍

视图&#xff1a; 视图一般都写在 app 的 views.py 中。并且视图的第一个参数永远都是 request &#xff08;一个HttpRequest&#xff09;对象。这个对象存储了请求过来的所有信息&#xff0c;包括携带的参数以及一些头部信息等。在视图中&#xff0c;一般是完成逻辑相关的操作…

Windows XP下vs2010中配置OpenCV2.4.3

1、 从http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.3/下载OpenCV2.4.3&#xff1b; 2、 将OpenCV-2.4.3.exe放到D:\Soft\OpenCV2.4.3文件夹下&#xff0c;解压到当前文件夹下&#xff0c;生成一个opencv文件夹&#xff1b; 3、 下载并安装CMake&…

改变shell read命令的隔符

2019独角兽企业重金招聘Python工程师标准>>> orgIFSIFS IFS"." ls */.fst/.txt | while read var1 var2 var3 do IFS$orgIFS fstcompile --isymbols${path1}isymtab.txt --osymbols${path1}osymtab.txt ${var1}/.fst/.txt ${var1}/.fst fstdraw --isymbol…

AutoML前沿技术与实践经验分享 | 免费报名

传统机器学习的解决范式可表示为&#xff1a;ML Solution ML expertise Computation Data新机器学习范式可表示为&#xff1a;New ML Solution 100x Computation 100x Data通过表示的变化&#xff0c;可以看出&#xff0c;传统范式的“ML expertise”被“100x”的“Comput…

传承乡邦文化,展示国学之美,联墨香飘远,文明花放红;

2019独角兽企业重金招聘Python工程师标准>>> 12月16日上午&#xff0c;阳光普照&#xff0c;翰墨飘香。由揭阳市文联指导、揭阳市楹联学会主办、榕城区图书馆协办的“我们的美好生活”原创联墨作品展在榕城区图书馆隆重开幕。 此次活动意在传承乡邦文化&#xff0c;…

VS2010运行速度优化汇总

1、 工具-->选项-->环境&#xff1a;视觉体验&#xff0c;前对勾全去掉&#xff1b; 2、 工具-->选项-->环境-->启动&#xff1a;启动时(P)下拉列表框中选择&#xff1a;显示空环境&#xff1b; 3、 工具-->选项-->文本编辑器-->C/C-->高级&am…

(一)JDBC入门及简介

引用百度对JDBC的解释&#xff1a; JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供…

OpenCV中OpenCL模块函数

It currently develop and test on GPU devices only. This includes both discrete GPUs(NVidia,AMD), as well as integrated chips(AMD APU and intel HD devices). The ocl module can be found under the “modules”directory. In “modules/ocl/src” you can find the…

这位创造GitHub冠军项目的“老男人”,堪称10倍程序员本尊

作者 | 马超&#xff0c;CSDN博客专家&#xff0c;金融科技从业者来源 | CSDN博客7月12日一款叫做TDengine的时序数据库项目在GitHub上开源了&#xff0c;这个项目一经发布就稳稳占据了GitHub排行榜的C位&#xff0c;目前TdEngine已经累积了5000多个star,并且连续一周排在上升榜…

hdu 1724 Ellipse——辛普森积分

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1724 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define db double using namespace std; const db eps1e-5; int T;db a,b,l,r; db f(db x){return sqrt(…

模仿Hibernate的逆向工程_java版_源码下载

在这篇blog&#xff1a;"Hibernate逆向工程原理_java版本"中谈到了Hibernate逆向工程原理。 我喜欢理论和实践相结合....so,今天我试着模仿hibernate的逆向工程&#xff0c;哈哈&#xff0c;我成功啦.... 话不多说....直接上图先&#xff1a; 项目结构&#xff1a; 运…

http协议进阶(三)http报文

一、报文流 http报文是在http应用程序之间发送的数据块&#xff08;也可称为数据包&#xff09;、这些数据块以一些文本的元信息&#xff08;meta-information&#xff09;开头&#xff0c;描述了报文的内容及含义&#xff0c;后面跟着 可选的数据部分&#xff0c;这些报文在客…

一行Python代码能实现什么丧心病狂的功能?

作者 | 天元浪子来源 | CSDN博客手头有 109 张头部 CT 的断层扫描图片&#xff0c;我打算用这些图片尝试头部的三维重建。基础工作之一&#xff0c;就是要把这些图片数据读出来&#xff0c;组织成一个三维的数据结构&#xff08;实际上是四维的&#xff0c;因为每个像素有 RGB…

Windows7 32位机上,OpenCV中配置GPU操作步骤

1、 查看本机配置&#xff0c;查看显卡类型是否支持NVIDIA GPU&#xff0c;本机显卡为NVIDIA GeForce 8400 GS&#xff1b; 2、 从http://www.nvidia.cn/Download/index.aspx?langcn下载最新驱动并安装&#xff1b; 3、 从https://developer.nvidia.com/cuda-toolkit根据…

【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

这是我悲惨的接近爆零的一次考试&#xff0c;但是本蒟蒻不能放弃&#xff0c;还是要总结的QAQ 答题卡 【题目背景】 八月是个悲惨的月份。先不谈炎热的天气&#xff0c;对于新生来说&#xff0c;八月意味着军训&#xff1b; 而对于高二高三的同学来说&#xff0c;八月意味着开学…