Open yaofly2012 opened 4 years ago
Request
Request
表示一个Http请求,从HTTP角度看一个请求格式是:
method url HTTP/版本
Request
则是表示这三块信息的对象,并添加了一些扩展信息,可以看下RequestInit
。
Request.mode
控制请求模式,有4个取值:
Fetch API cannot load http://127.0.0.1:8090/fetch. Request mode is "same-origin" but the URL's origin is not same as the request origin http://127.0.0.1:8080.
Response.type="opaque"
,JS无法访问Response的属性,否则会报错。Request
不只是服务fetch
,fetch
函数估计用不到。默认值:
new Request()
构造(fetch
内部也是这种方式),则默认值为cors
,其他创建方式(例如,对与嵌入资源发起的请求)都是no-cors
Request.credentials
控制请求是否携带Cookie
, basic http auth
,主要针对跨域请求。有3个取值:
Cookie
,即使同源请求也不携带;
同`XMLHttpRequest.withCredentials=true`Cookie
;Cookie
,basic http auth
。
类似`XMLHttpRequest.withCredentials=true`默认值:
浏览器默认值是same-origin
, 但在旧版本浏览器,例如safari 11依旧是omit,safari 12已更改。
Headers
存储Request
和Response
的Header数据,并提供相关的操作API(增,删,改,查)。
Headers
本质也就是key-value对,但是key
是大小写不敏感的。add
方法,因为添加header有三种方式
Accept
header)所以单独的add
方法并不能表达具体的添加方式,最终使用语言更明确的Headers.append()
和Headers.set()
方法添加header。
Headers
存储是有序的,按照字典字母升序排列(统一转成小写格式排序)。Headers.keys()
容易联想到Object.keys,但是Headers.keys()
返回的是iterator
,不是数组。在使用fetch
或者直接调用Header
构造函数时,一般直接传递个初始化对象,而不是调用append
或则set
方法。
fetch('http://exmaple.com', {
headers: {
test: 'yao'
}
})
var headers = new Headers({
test: 'yao'
})
为啥不简单点直接用一般的对象代表Headers
,而是单独使用Header
API?
Headers
对象并没有那么简单:
Header
的name
/value
字符串集比对象的key
/value
字符集较窄。并且对应非法的name
会抛异常:
// Failed to construct 'Headers': Invalid name
var headers = new Headers({
'{': 'hello'
})
Headers
对象具有Guard
特性。Guard
?A Headers object also has an associated guard
Guard is a feature of Headers objects
影响set()
, append()
, delete()
方法的行为。
Guard
处理过程:Guard是内部自动控制,无法手动修改。
Headers
对象时,Guard
为none
,此时可以任意操作Headers
;当创建了Request
或者Response
对象时,关联的Headers
的guard
取值:
request
不能修改禁止修改Request Headers
var headers = new Headers({
'x-test': 'yaoq',
'A': 'A',
'z-upper': 'z',
'1': '1'
})
// append1
headers.append('Accept', 'application/json')
for(var key of headers.keys(headers)) {
console.log(key)
}
var req = new Request(url, {
// mode: 'no-cors',
// credentials: 'same-origin',
headers: headers
})
// append2
headers.append('x-test2', 'text/html')
for(var key of headers.keys(headers)) {
console.log(key)
}
但是append2
处依旧可以添加新的header,只是最终的Request请求里并没有x-test2
header。
request-no-cors
只能发送CORS Simple Headers
跟取值request
类似,虽然可以操作Headers
对象,但最终的Request请求只有CORS Simple Headers
response 不准许修改禁止修改Response Headers
immutable
无法修改Headers
,否则抛TypeError
。
fetch
函数的Response
的Headers
也是immutable
。
Headers.append
逻辑,理解guard
一、
fetch
函数1.1 语法
形参同
Request
本质上也是通过实参创建
Request
实例,即:等价于:
fetch
返回值Promise被rejectFetch_API里提到:
即只有当网络请求不能完成时才会
reject
,如:CORS
预检失败1.2 fetch & timeout
fetch
没有超时配置。一般通过Promsie.race
进行处理。也有利用
Promise.then
处理的:1.3 中断
fetch
请求如何取消异步操作
1.4 PK
XMLHttpRequest
MDN fetch API:
fetch
没有超时API,而XMLHttpRequest
有;好吧已经讨论了 Fetch 永生 Why I still use XHR instead of the Fetch API MDN Using Fetch也在讨论了
1.5 APIs
fetch
函数只是Fetch 系列 API之一。Request
和Response
不只是只能应用在fetch
,他们比较一般化,可以应用在其他处理Request
,Response
的场景(如SW里所有的请求和响应都是Request
和Response
)。参考: