fetch
从云端运行环境发送请求、读取响应并取消网络操作。
全局 fetch 从云端运行环境发起请求,可用于调用公共 API、上传数据和流式读取响应,无需导入模块。访问客户端本机或内网服务时,使用 lexmount:remote 的 host.fetch。
const response = await fetch('https://example.com');
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());fetch(input, init?)
功能: 发送请求,在收到响应头后返回响应对象。读取正文是后续独立的异步操作。
declare function fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
input | string / URL / Request | 是 | 完整 URL,或已有请求对象 |
init | RequestInit | 否 | 请求配置;指定字段覆盖 input 请求中的相应配置 |
init.method | string | 否 | 默认 GET;GET / HEAD 不能携带正文 |
init.headers | HeadersInit | 否 | Headers、字符串键值对象或 [名称, 值] 数组 |
init.body | BodyInit / null | 否 | 字符串、Blob / File、ArrayBuffer / ArrayBufferView(含 TypedArray、DataView)、FormData、URLSearchParams 或字节 ReadableStream |
init.signal | AbortSignal / null | 否 | 取消等待响应或读取正文,默认不主动取消 |
init.redirect | RequestRedirect | 否 | follow(默认)、manual 或 error |
返回值: Promise<Response>。HTTP 4xx / 5xx 正常返回响应,应检查 ok 或 status。网络、解析、TLS 或目标地址校验失败时 Promise 拒绝;非法方法、已使用的正文等也可能导致 TypeError。
传入 FormData 时让运行时生成含 boundary 的 Content-Type;JSON 需先 JSON.stringify() 并设置相应请求头。ReadableStream 上传使用字节分块。
以下 RequestInit 字段也可传入,但当前仅保留在请求对象中,不提供对应的浏览器缓存、Cookie、CORS 或完整性校验机制:
| 字段 | 类型 / 可选值 | 默认值与说明 |
|---|---|---|
referrer | string | about:client;也可为空字符串或完整 URL |
referrerPolicy | ReferrerPolicy | 默认空字符串;另接受 no-referrer、no-referrer-when-downgrade、same-origin、origin、strict-origin、origin-when-cross-origin、strict-origin-when-cross-origin、unsafe-url |
mode | 'cors' / 'same-origin' / 'no-cors' | cors;不接受 navigate |
credentials | 'omit' / 'same-origin' / 'include' | same-origin;不会自动附加登录 Cookie |
cache | 'default' / 'no-store' / 'reload' / 'no-cache' / 'force-cache' / 'only-if-cached' | default;only-if-cached 要求 mode 为 same-origin |
integrity | string | 空字符串;不执行子资源完整性校验 |
keepalive | boolean | false;不保证任务结束后请求继续执行 |
priority | 'auto' / 'high' / 'low' | auto;不保证网络调度优先级 |
网络范围与请求选项
HTTP(S) 请求仅允许公网目标,DNS 解析结果和每一跳重定向也受限制。回环、私网及其他非公网地址会被拒绝。data: 和 blob: URL 可用于读取内联或本次环境中的对象数据,不经过 HTTP 网络。
服务端请求没有浏览器页面的相对 URL 基址、登录 Cookie Jar 或浏览器 HTTP 缓存;credentials、mode、cache 等浏览器侧选项不能建立这些能力。需要认证时显式设置请求头。宿主代理和证书信任由平台管理,业务环境变量不能重新配置请求客户端。
Response
以下为 fetch() 返回的响应属性:
| 属性 | 类型 | 说明 |
|---|---|---|
ok | boolean | 状态码是否为 200~299 |
status | number | HTTP 状态码 |
statusText | string | 状态文本,可能为空 |
headers | Headers | 响应头;headers.get(name) 返回字符串或 null,支持迭代 |
url | string | 响应 URL |
redirected | boolean | 是否经过自动重定向 |
type | ResponseType | 响应类型 |
body | ReadableStream<Uint8Array> / null | 按需读取的字节流;HEAD 等无正文响应为 null |
bodyUsed | boolean | 正文是否已经开始消费 |
正文读取方法
下列方法均不接收参数。除 clone() 外,都会消费整个正文并返回 Promise;同一个正文只能消费一次。
| 方法 | 功能 | 返回值 |
|---|---|---|
response.text() | 按 UTF-8 解码正文 | Promise<string> |
response.json() | 将正文解析为 JSON;非法 JSON 会拒绝 | Promise<any> |
response.arrayBuffer() | 获取完整原始字节 | Promise<ArrayBuffer> |
response.bytes() | 获取完整字节数组 | Promise<Uint8Array> |
response.blob() | 获取含媒体类型的二进制对象 | Promise<Blob> |
response.formData() | 解析支持的表单编码正文 | Promise<FormData> |
response.clone() | 在正文未使用或锁定前复制响应,分流正文 | Response,同步返回 |
流式读取时使用 response.body.getReader();完成后释放 reader 锁。不准备读取正文时调用 await response.body?.cancel();正文已被 reader 锁定时通过 reader 取消。完整读取会占用相应内存,克隆后也应消费或取消各分支。
取消与超时
fetch() 没有 timeoutMs 参数。可传入 AbortSignal.timeout(milliseconds),或调用 AbortController.abort(reason?);取消会影响请求及其响应正文,Promise 或正在进行的读取会拒绝。
const response = await fetch('https://example.com', {
signal: AbortSignal.timeout(10000),
});
console.log(await response.text());超时信号通常以 TimeoutError 拒绝,控制器未指定原因时使用 AbortError;自行传入原因时按该原因处理。任务停止或超时也会清理网络资源。取消不能撤回目标服务已经执行的业务操作。
通过默认导出提供 HTTP 服务的方式见公开 HTTP 服务示例。
