Fetch知识体系(一)
https://blog.youkuaiyun.com/askscl/article/details/136156631
四、Request对象
-
创建Request 对象
-
const r = new Request(url, init)
-
-
克隆Request 对象
-
使用构造函数
-
再次传入init对象,会覆盖对象中同名的值
-
第一个请求体会被标记为‘已使用’
-
如果源对象与创建的新对象不同源,则 referrer 属性会被清除。
-
此外,如果源对象的 mode 为navigate ,则会被转换为 same-origin 。
-
-
使用clone()
-
任何值都不会被覆盖
-
不会将任何请求的请求体标记为“已使用”
-
-
注意事项:
-
如果请求对象的 bodyUsed 属性为 true (即请求体已被读取),
-
那么上述任何一种方式都不能用来创建这个对象的副本。在请求体被读取之后再克隆会导致抛出 TypeError 。
-
-
-
-
在 fetch() 中使用 Request 对象
-
不能拿请求体已经用过的Request 对象来发送请求
-
有请求体的Request对象只能在fetch中使用一次
-
想多次使用Request对象,在Request使用前,可以使用克隆的对象
-
五、Response对象
-
创建Response 对象
-
两个可选参数
-
const r = new Response(body, init);
-
-
两个静态方法
-
Response.redirect()
-
Response.error()
-
-
-
读取响应状态信息
-
克隆 Response 对象(与Request规则类似)
-
使用clone()
-
注意事项
-
如果响应对象的 bodyUsed 属性为 true (即响应体已被读取),
-
则不能再创建这个对象的副本。在响应体被读取之后再克隆会导致抛出 TypeError 。
-
-
有响应体的 Response 对象只能读取一次。(不包含响应体的 Response 对象不受此限制。)
-
要多次读取包含响应体的同一个 Response 对象,必须在第一次读取前调用 clone()
-
通过创建带有原始响应体的 Response 实例,可以执行伪克隆操作。
-
关键是这样不会把第一个 Response 实例标记为已读,而是会在两个响应之间共享
-
-
-
六、Request 、 Response 及 Body 混入
-
Body混入提供了5个方法
-
Body.text()
-
Body.json()
-
Body.formData()
-
append(键,值)
-
get(键)
-
-
Body.arrayBuffer()
-
(buf) => new Int8Array(buf)
-
-
Body.blob()
-
-
一次性流:
-
body被使用一次就会上锁,表现为bodyUsed: false
-
构建在ReadableStream 之上
-
-
使用 ReadableStream 主体:
-
目的:实时读取和操作数据
-
body.getReader()
-
read()
-
releaseLock()
-
-
TextDecoder()
-
decode(chunk, { stream: true})
-
-
双流技术
-
第一个流: body.getReader()
-
第二个流:new ReadableSteam()
-
作用:实时检查和操作流的内容
-
-
fetch存在问题
-
fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。
-
fetch只对网络请求报错,对400,500都当做成功的请求,服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
-
fetch默认不会带cookie,需要添加配置项: fetch(url, {credentials: ‘include’})
-
fetch没有办法原生监测请求的进度,而XHR可以
七、问答:
-
for await of?
-
在for of里,有异步值
-
-
为什么要引入流的概念?
-
有效载荷的大小可能会导致网络延迟
-
流API在处理 有效载荷方面有优势
-
-
缓冲区是什么?
-
将流转存到缓冲区的内存里
-
将缓冲区转换成某种js对象类型
-
通过期约产生结果
-
期约会等待主体流报告完成及缓冲被解析
-
-
客户端必须等待响应的资源完全加载才能访问其内容
-
-
管道是什么?
-
用于导入另一个流
-
-
fetch发送2次请求的原因?
-
条件:
-
跨域
-
使用消息格式: application/json
-
-
原因:
-
使用了带 预检(Preflighted)的跨域请求。该请求会在发送真实的请求之前发送一个类型为 OPTIONS的预检请求。
-
预检请求会 检测服务器是否有需要的跨域资源,有的话才会发送真实的请求。
-
例子
-
当我们在请求头部增加了authorization项,
-
那么在服务器响应头中需要放入Access-Control-Allow-Headers,并且其值中必须要包含authorization,
-
否则OPTIONS预检会失败,从而导致不会发送真实的请求。
-
-
-
-
fetch第一次发送option类型的请求,这个请求主要是用来 询问服务器是否允许修改header头等一些操作 ,
-
如果允许会返回204(服务器成功处理了请求,但没有返回任何内容),然后再发送真正的post请求拿回数据。
-
-
-