Js中fetch方法

fetch()方法定义在Window对象以及WorkerGlobalScope对象上,用于发起获取资源的请求,其返回一个Promise对象,这个Promise对象会在请求响应后被resolve,并传回Response对象。

描述

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

input: 定义要获取的资源,其值可以是:

  • 一个字符串,包含要获取资源的URL,一些浏览器会接受 blobdata作为schemes
  • 一个Request对象。

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

  • method: 请求使用的方法,如GETPOST
  • headers: 请求的头信息,形式为Headers的对象或包含ByteString值的对象字面量。
  • body: 请求的body信息:可能是一个BlobBufferSourceFormDataURLSearchParams或者USVString对象,注意GETHEAD方法的请求不能包含body信息。
  • mode: 请求的模式,如corsno-cors或者same-origin
  • credentials: 请求的credentials,如omitsame-origin或者include,为了在当前域名内自动发送cookie,必须提供这个选项。
  • cache: 请求的cache模式: defaultno-storereloadno-cacheforce-cache或者only-if-cached
  • redirect: 可用的redirect模式: follow自动重定向,error如果产生重定向将自动终止并且抛出一个错误,或者manual手动处理重定向。
  • referrer: 一个USVString可以是no-referrerclient或一个URL,默认是 client
  • referrerPolicy: 指定了HTTP头部referer字段的值,可能为以下值之一: no-referrerno-referrer-when-downgradeoriginorigin-when-cross-originunsafe-url
  • integrity: 包括请求的subresource integrity值,例如: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=

返回一个Promiseresolve时回传Response对象。

fetch与jQuery.ajax区别

  • 当接收到一个代表错误的HTTP状态码时,从fetch()返回的Promise不会被标记为 reject, 即使响应的HTTP状态码是404500,其会将Promise状态标记为 resolve,但是返回的Promise会将resolve的返回值的ok属性设置为false,仅当网络故障时或请求被阻止时,才会标记为reject
  • fetch()不会接受跨域cookies,你也不能使用fetch()建立起跨域会话,其他域的Set-Cookie头部字段将会被无视。
  • fetch()不会发送cookies,除非使用了credentials的初始化选项。

实例

发起请求

发起一个简单的资源请求,对于fetch请求返回一个Promise对象,这个Promise对象会在请求响应后被resolve,并传回Response对象。

window.fetch("https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js")
.then(res => console.log(res))

设置参数

通过init配置对象设置参数,可以设置methodheadersbodymodecredentialscacheredirectreferrerreferrerPolicyintegrity

var headers = new Headers({
"accept": "application/javascript"
});
headers.append("accept", "application/xml");
headers.set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36");
window.fetch("https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js", {
method: "GET",
headers: headers,
cache: 'no-cache',
})
.then(res => console.log(res))

Headers对象

  • Headers.append(): 给现有的header添加一个值, 或者添加一个未存在的header并赋值。
  • Headers.delete(): 从Headers对象中删除指定header
  • Headers.entries(): 以迭代器的形式返回Headers对象中所有的键值对。
  • Headers.get(): 以ByteString的形式从Headers对象中返回指定header的全部值。
  • Headers.has(): 以布尔值的形式从Headers对象中返回是否存在指定的header
  • Headers.keys(): 以迭代器的形式返回Headers对象中所有存在的header名。
  • Headers.set(): 替换现有的header的值, 或者添加一个未存在的header并赋值。
  • Headers.values(): 以迭代器的形式返回Headers对象中所有存在的header的值。

响应处理

通过Response对象对响应的数据作处理,包括获取响应状态以及响应体的处理等操作。

window.fetch("https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js")
.then(res => res.text())
.then(data => console.log(data))

Response对象

Response对象的相关属性与方法:

  • Response.headers: 只读,包含此Response所关联的Headers对象。
  • Response.ok: 只读,包含了一个布尔值,标示该Response成功,HTTP状态码的范围在 200-299
  • Response.redirected: 只读,表示该Response是否来自一个重定向,如果是的话,它的URL列表将会有多个条目。
  • Response.status: 只读,包含Response的状态码。
  • Response.statusText: 只读,包含了与该Response状态码一致的状态信息。
  • Response.type: 只读,包含Response的类型,例如basiccors
  • Response.url: 只读,包含ResponseURL
  • Response.useFinalURL: 包含了一个布尔值,来标示这是否是该Response的最终URL
  • Response.clone(): 创建一个Response对象的克隆。
  • Response.error(): 返回一个绑定了网络错误的新的Response对象。
  • Response.redirect(): 用另一个URL创建一个新的Response

Response实现了Body接口,相关属性与方法可以直接使用:

  • Body.body: 只读,一个简单的getter,用于暴露一个ReadableStream类型的body内容。
  • Body.bodyUsed: 只读,包含了一个布尔值来标示该Response是否读取过Body
  • Body.arrayBuffer(): 读取Response对象并且将它设置为已读,并返回一个被解析为ArrayBuffer格式的Promise对象,Responses对象被设置为了stream的方式,所以它们只能被读取一次。
  • Body.blob():

    读取Response对象并且将它设置为已读,并返回一个被解析为Blob格式的Promise对象。
  • Body.formData():

    读取Response对象并且将它设置为已读,并返回一个被解析为FormData格式的Promise对象。
  • Body.json():

    读取Response对象并且将它设置为已读,并返回一个被解析为JSON格式的Promise对象。
  • Body.text():

    读取Response对象并且将它设置为已读,并返回一个被解析为USVString格式的Promise对象。

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://segmentfault.com/a/1190000012740215
https://developer.mozilla.org/zh-CN/docs/Web/API/Headers
https://developer.mozilla.org/zh-CN/docs/Web/API/Response
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
https://developer.mozilla.org/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/fetch

Js中fetch方法的更多相关文章

  1. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  2. 原生JS中apply()方法的一个值得注意的用法

    今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...

  3. js中apply方法的使用

    js中apply方法的使用   1.对象的继承,一般的做法是复制:Object.extend prototype.js的实现方式是: Object.extend = function(destinat ...

  4. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载

    paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...

  5. js中settimeout方法加参数

    js中settimeout方法加参数的使用. 简单使用看w3school  里面没有参数调用,  例子: <script type="text/javascript"> ...

  6. js中split()方法得到的数组长度

    js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...

  7. 关于JS中的方法是否加括号的问题

    js中的方法什么时候加括号什么时候不加括号呢,我们有时候经常就搞不清楚,记住下面这几点就好理解了. 1.函数做参数时都不要加括号. function fun(a){ alert(a); } funct ...

  8. js中的方法如何传入多个参数

    js中的方法如何传入多个参数 $(function () { let parameter1 = 1; let parameter2 = 'Hello World'; let parameter3 = ...

  9. js 中的方法注入(aop)

    js 中的方法注入 java中很多框架支持 apo 的注入, js中也可以类似的进行实现 主要是通过扩展js中方法的老祖 Function 对象来进行实现. Function.prototype.af ...

  10. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)

    1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...

随机推荐

  1. SQLServer数据库优化学习-总结

    SQLServer数据库优化学习-总结 背景 各种能力都需要提升. 最近总是遇到SQLServer的问题 趁着周末进行一下学习与提高. 安装与优化 1. 数据库必须安装 64位, 不要安装成32位的版 ...

  2. [转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)

    https://www.jianshu.com/p/fd46652f247e 摘要:Linux,crontab整理crontab的使用,包括cron表达式,设置和删除任务,权限管理,查看日志 cron ...

  3. 【转帖】JVM 内存模型与垃圾回收

    文章目录 1. JVM内存模型 1.1. 程序计数器 (线程私有) 1.2. Java 虚拟机栈 (线程私有) 1.3. 本地方法栈 (线程私有) 1.4. Java 堆 (线程共享) 1.5. 方法 ...

  4. [转帖]Web性能优化工具WebPageTest(三)——本地部署(Windows 7版本)

    http://www.zlprogram.com/Show/30/30117.shtml 这次先能够使用PC端的浏览器测试,首先需要下载官方的发布版本"WebPageTest 3.0&quo ...

  5. [转帖]vs调试运行程序出现:“由于找不到MSVCP140D.dll,无法继续执行代码 ”的解决方法

    碎碎念 最近在使用Visual studio调试程序的时候,突然冒出了"由于找不到MSVCP140D.dll,无法继续执行代码.重新安装程序可能会解决次问题."的错误.如下图所示. ...

  6. [转帖]setsockopt(setsockopt的使用方法及注意事项)

    http://xingzuo.aitcweb.com/9156453.html 1. setsockopt简介 setsockopt是一个系统调用函数,用于设置套接字选项.套接字是指通信的两个端点之间 ...

  7. 信创CPU与牙膏厂和按摩店CPU的简单对比

    信创CPU与牙膏厂和按摩店CPU的简单对比 摘要 周天时学习验证了SPEC2006的工具. 晚上时写完了第一稿简单的使用 因为 SPEC 完整跑完非常漫长. 我想了一下短平快还是通过使用一个简单的 r ...

  8. nginx 进行目录浏览的简单配置

    1. 公司网络安全不让用vsftpd的匿名网络访问了, 没办法 只能够使用 nginx 通过http协议来处理. 2. 最简单的办法就是另外开一个nginx进程简单设置一下nginx的配置文件 wor ...

  9. 使用influxdb以及Grafana监控vCenter的操作步骤

    1. 下载安装介质 计划telegraf和influxdb 使用rpm包进行安装.Grafana使用docker容器方式安装 下载路径为: https://repos.influxdata.com/r ...

  10. vue3封装搜索表单组件

    seacrch 表单完成的功能 1.根据配置json配置项自动生成表单 ok 2.是响应式的排版 ok 3.点击搜索按钮会向上抛出值 ok 4.点击重置按钮会自动清空数据,不需要父组件额外的处理 ok ...