Request - 表示一个资源请求
Request
是 Fetch API 的接口,表示一个资源请求。
您可以使用 Request()
构造函数创建一个新的 Request
对象。但是更有可能遇到作为另一个 API 操作(例如服务 Worker 的 FetchEvent.request
)的结果而返回的请求对象。
构造函数
Request()
创建一个新的 Request
对象。
属性
Request.cache
只读
包含请求的缓存模式(例如,default
,reload
,no-cache
)。
Request.context
只读
包含请求的上下文(例如,audio
,image
,iframe
等)
Request.credentials
只读
包含请求的凭据(例如,omit
, same-origin
, include
)。默认值为 same-origin
。
Request.destination
只读
一个字符串,来自 RequestDestination
枚举,描述请求的目的地。这是一个指示所请求内容类型的字符串。
Request.headers
只读
包含请求的关联 Headers
对象。
Request.integrity
只读
包含请求的子资源完整性值(例如,sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=
)。
Request.method
只读
包含请求的方法(GET
,POST
等)
Request.mode
只读
包含请求的模式(例如,cors
,no-cors
,same-origin
,navigate
。)
Request.redirect
只读
包含如何处理重定向的模式。它可以是 follow
,error
或 manual
之一。
Request.referrer
只读
包含请求的来源网址(例如,client
)。
Request.referrerPolicy
只读
包含请求的引荐网址策略(例如,no-referrer
)。
Request.url
只读
包含请求的 URL。
Request
实现了 Body
,因此它还继承了以下属性:
body
只读
一个简单的获取方法,用于获取主体内容的 ReadableStream
。
bodyUsed
只读
存储一个 Boolean
,它声明是否已在响应中使用主体。
方法
Request.clone()
创建当前 Request
对象的副本。
Request
实现了 Body
,因此它还具有以下可用方法:
Body.arrayBuffer()
返回一个 Promise,解析为请求主体的 ArrayBuffer
表示形式。
Body.blob()
返回一个 Promise,解析为请求主体的 Blob
表示形式。
Body.formData()
返回一个 Promise,解析为请求主体的 FormData
表示形式。
Body.json()
返回一个 Promise,解析为请求主体的 JSON
表示形式。
Body.text()
返回一个 Promise,解析为请求主体的 USVString
(文本)表示形式。
注意:
Body
函数只能运行一次;后续调用将解析为空的字符串 / ArrayBuffers 。
实例
在以下代码段中,我们使用 Request()
构造函数创建一个新请求(访问与脚本位于同一目录中的图像文件),然后返回该请求的一些属性值:
const request = new Request('https://www.mozilla.org/favicon.ico');
const URL = request.url;
const method = request.method;
const credentials = request.credentials;
然后,您可以通过将 Request
对象作为参数传递给 WindowOrWorkerGlobalScope.fetch()
调用来获取此请求,例如:
fetch(request)
.then(response => response.blob())
.then(blob => {
image.src = URL.createObjectURL(blob);
});
在以下代码段中,我们使用 Request()
构造函数创建一个新请求,其中包含一些需要主体 payload 的 api 请求的初始数据和主体内容:
const request = new Request('https://example.com', {method: 'POST', body: '{"foo": "bar"}'});
const URL = request.url;
const method = request.method;
const credentials = request.credentials;
const bodyUsed = request.bodyUsed;
注意:主体类型只能是
Blob
,BufferSource
,FormData
,URLSearchParams
,USVString
或ReadableStream
类型,因此要将 JSON 对象添加到有效负载中,您需要对该对象进行字符串化。
然后,您可以通过将 Request
对象作为参数传递给 WindowOrWorkerGlobalScope.fetch()
调用来获取此 api 请求,并获取响应:
fetch(request)
.then(response => {
if (response.status === 200) {
return response.json();
} else {
throw new Error('api 服务器出了点问题!');
}
})
.then(response => {
console.debug(response);
// ...
}).catch(error => {
console.error(error);
});
规范
规范 | 状态 | 备注 |
---|---|---|
Fetch Request 的定义 |
现行的标准 | 初始定义 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 42 41 | 支持 | 39 34 | 不支持 | 28 | 10.1 |
Request() 构造函数 | 411 | 15 | 39 34 | 不支持 | 29 28 | 10.1 |
cache | 64 | 14 | 48 | 不支持 | 51 | 11 |
clone | 42 41 | 14 | 39 34 | 不支持 | 29 28 | 不支持 |
context | 42 — 46 | 未知 | 39 — 424 | 不支持 | 28 — 29 | 不支持 |
credentials | 42 41 | 14 | 39 34 | 不支持 | 29 28 | 不支持 |
destination | 65 | 14 | 61 | 不支持 | 52 | 10.1 |
headers | 42 41 | 14 | 39 34 | 不支持 | 29 28 | 不支持 |
integrity | 46 | 14 | 支持 | 不支持 | 支持 | 不支持 |
keepalive | 66 | 15 | 未知 | 不支持 | 43 | 不支持 |
method | 42 41 | 14 | 39 34 | 不支持 | 29 28 | 不支持 |
mode | 42 | 14 | 39 | 不支持 | 29 | 不支持 |
redirect | 46 | 14 | 支持 | 不支持 | 支持 | 不支持 |
referrer | 42 41 | 14 | 47 | 不支持 | 29 28 | 不支持 |
referrerPolicy | 52 | 14 | 52 | 不支持 | 39 | 11.1 |
signal | 66 | 16 | 支持 | 不支持 | 支持 | 未知 |
url | 425 | 14 | 39 34 | 不支持 | 296 | 10.1 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 42 | 42 41 | 未知 | 支持 | 未知 | 28 | 10.3 |
Request() 构造函数 | 423 | 411 | 未知 | 支持 | 未知 | 29 28 | 10.3 |
cache | 64 | 64 | 未知 | 不支持 | 未知 | 47 | 不支持 |
clone | 不支持 | 不支持 | 未知 | 不支持 | 未知 | 29 28 | 不支持 |
context | 42 — 46 | 42 — 46 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
credentials | 42 | 42 | 未知 | 不支持 | 未知 | 29 28 | 不支持 |
destination | 65 | 65 | 未知 | 61 | 未知 | 47 | 10.3 |
headers | 不支持 | 42 — 46 | 未知 | 不支持 | 未知 | 29 28 | 不支持 |
integrity | 不支持 | 46 | 未知 | 不支持 | 未知 | 支持 | 不支持 |
keepalive | 66 | 66 | 未知 | 未知 | 未知 | 43 | 不支持 |
method | 不支持 | 42 — 46 | 未知 | 不支持 | 未知 | 29 28 | 不支持 |
mode | 49 | 49 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
redirect | 不支持 | 46 | 未知 | 支持 | 未知 | 支持 | 不支持 |
referrer | 不支持 | 不支持 | 未知 | 不支持 | 未知 | 29 28 | 不支持 |
referrerPolicy | 52 | 52 | 未知 | 52 | 未知 | 41 | 不支持 |
signal | 66 | 66 | 未知 | 支持 | 未知 | 支持 | 未知 |
url | 425 | 425 | 未知 | 不支持 | 未知 | 296 | 10.3 |
1. 从 Chrome 47 开始,init
参数的属性的默认值已更改。mode
默认为 same-origin
(原来是 no-cors
)。credentials
默认为 include
(原来是 same-origin
)。redirect
默认为 follow
(原来是 manual
)。
2. init 参数的某些默认值在 Samsung Internet 5.0 中已更改。有关详细信息,请参见 “属性” 部分。
3. 从 WebView 47 开始,init
参数的属性的默认值已更改。mode
默认为 same-origin
(原来是 no-cors
)。credentials
默认为 include
(原来是 same-origin
)。redirect
默认为 follow
(原来是 manual
)。
4. 有关更多信息,请参见 bug 1188062。
5. Chrome 59 中添加了 Fragment 支持。
6. Opera 46 中添加了 Fragment 支持。