Fetch API
本页提供 app.fetch 内置 HTTP 客户端的精简 API 参考。完整的使用指南、示例和最佳实践请参阅 内置 HTTP 客户端指南。
app.fetch(input, init?)
发送 HTTP 请求。签名与原生 fetch 兼容,额外支持超时、重试和 requestId 传播。
参数
返回值: Promise<Response> — 标准 Fetch API Response 对象
快捷方法
app.fetch.get(url, init?)
发送 GET 请求。
app.fetch.post(url, body?, init?)
发送 POST 请求。当 body 不为 null/undefined 时,会自动 JSON.stringify 并设置 Content-Type: application/json;当 body 为空时,不设置 Content-Type,也不发送请求体。
app.fetch.put(url, body?, init?)
发送 PUT 请求。body 处理行为与 post 相同(仅在 body != null 时设置 Content-Type)。
app.fetch.patch(url, body?, init?)
发送 PATCH 请求。body 处理行为与 post 相同(仅在 body != null 时设置 Content-Type)。
app.fetch.delete(url, init?)
发送 DELETE 请求。
app.fetch.create(options)
创建预配置的子客户端实例。子客户端拥有独立的 baseURL、默认 headers、超时和重试配置。
子客户端上也挂载了完整的快捷方法(get / post / put / patch / delete)和 create()。
类型定义
VextFetchInit
继承自标准 RequestInit,扩展以下字段:
VextFetchClientOptions
create() 工厂方法的配置选项。
VextFetch
app.fetch 和 create() 返回值的类型定义。既是可调用函数,又挂载了快捷方法。
全局配置
在 vext.config.ts 中通过 fetch 字段配置全局默认值:
配置后,框架在每个请求的 requestId 中间件阶段,从入站请求头中读取列表中指定的头,
写入 requestContext.store.propagatedHeaders。app.fetch 出站时自动从 store 中读取并注入,
无需在每次调用时手动传递。
- 全局配置
config.fetch.propagateHeaders:声明哪些头需要被捕获和透传 - 未在全局配置中声明的头:在
init.headers中手动设置即可 - 详见 请求上下文 → 与分布式追踪的关系 :::
优先级
行为说明
超时
- 使用
AbortController+setTimeout实现 - 超时后抛出
Error,消息格式:[app.fetch] GET https://... timed out after 10000ms - 如果同时传入了
init.signal,会与超时 signal 合并——任一触发都中止请求
重试
- 仅幂等方法重试:
GET/HEAD/OPTIONS/PUT/DELETE - POST / PATCH 不重试(避免副作用重复执行)
- 触发条件:HTTP 5xx 响应 或 网络错误
- 不触发:超时(直接抛错)、4xx 响应
retryDelay支持函数形式实现指数退避:(attempt) => Math.min(1000 * 2 ** attempt, 10000)
requestId 传播
- 自动从
requestContext(AsyncLocalStorage)读取当前请求的requestId - 注入到出站请求的
x-request-id头 - 设置
propagateRequestId: false可禁用
结构化日志
每个出站请求自动记录结构化日志:
日志字段:type: "outbound" / method / url / status / duration / requestId
替换实现
通过 app.setFetch() 替换内置实现:
:::warning 替换后将失去内置的 requestId 传播、超时、重试等能力。
类型导入
下一步
- 阅读 内置 HTTP 客户端指南 了解完整用法和最佳实践
- 查看 应用实例 中
app.fetch的挂载位置 - 了解 配置项 中
fetch相关的全局配置