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. java - 运行可执行文件 (.exe)

    package filerun; import java.io.File; import java.io.IOException; public class RunExe { public stati ...

  2. [转帖]TiDB 使用 dumpling 导出数据,并使用 lightning 导入到另一个 TiDB 库

    本文介绍从 TiDB-A 库导出数据到 TiDB-B 库: 导出 Dumpling 包含在 tidb-toolkit 安装包中,可在此下载. 从 TiDB/MySQL 导出数据 需要的权限 SELEC ...

  3. [转帖]命令行非明文密码连接 TiDB

    https://tidb.net/blog/6794a34b#%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE ...

  4. [转帖]CTF -bugku-misc(持续更新直到全部刷完)

    CTF -bugku-misc(持续更新直到全部刷完) https://www.cnblogs.com/cat47/p/11432475.html 1.签到题 点开可见.(这题就不浪费键盘了) CTF ...

  5. 时间片 线程切换 指令周期 流水线 TPS的初步了解

    时间片 线程切换 指令周期 流水线 TPS的初步了解 情况说明 Redis 单线程提供服务, 可以支撑十万级别的TPS 通过以个非常简单的测试 redis-benchmark -c 50 -n 500 ...

  6. [转帖]Linux命令拾遗-%iowait指标代表了什么?

    https://www.cnblogs.com/codelogs/p/16060759.html 简介# 一直以来,我都知道top.vmstat.mpstat中有一个叫wa(%iowait)的cpu指 ...

  7. 我们开源了一个轻量的 Web IDE UI 框架

    我们开源了一个轻量的 Web IDE UI 框架 Molecule 一个轻量的 Web IDE UI 框架 简介 Molecule 是一个受 VS Code 启发,使用 React.js 构建的 We ...

  8. TypeScript工具类 Partial 和 Required 的详细讲解

    场景描述: 场景描述:一个接口(IPerson)有很多个的字段,可能有几百.而且这些字段都是必须的. 我们需要使用这个接口,但是我又不可能使用它的全部.可能只会使用几个. 我还必须要使用这接口.这个时 ...

  9. vue中$once的使用

    $once 可以给组件实例绑定一个自定义事件,但该事件只能被触发一次,触发之后随即被移除 $once的简单使用 <template> <div> <button @cli ...

  10. 你对iframe知道多少

    iframe 嵌套第三方页面出现的问题 我们需要通过一个接口获取被嵌套的地址. 然后将改地址赋值给iframe的src中,代码如下 <template> <div> <i ...