Skip to content

响应 Envelope

Envelope 层负责判断已解析的 HTTP response 是否成功,并决定哪个值成为 T

默认只处理 HTTP

没有 envelope policy 时,core 只看 HTTP status,并原样返回解析后的 body:

ts
const rest = createHttp({
  adapter: "fetch",
});

body 中即使存在 codestatussuccess,项目没有选择 policy 前都不会产生特殊含义。

标准字段映射

下面这种 packet 需要明确设置 envelope: {}

ts
interface DefaultEnvelope<T> {
  code: number | string;
  msg?: string;
  data: T;
}
ts
const api = createHttp({
  adapter: "fetch",
  envelope: {},
});

const user = await api.get<User>("/users/1");
const packet = await api.envelope<DefaultEnvelope<User>>("/users/1");

code: 200 表示成功,code: 401 表示未授权。HTTP status 优先,HTTP 500 不会因为 body 有 code: 200 就变成成功。

映射不同字段名

ts
const partner = createHttp({
  adapter: "fetch",
  envelope: {
    code: "errno",
    msg: "errmsg",
    data: "result",
    ok: (code) => code === 0,
    unauthorized: (code) => code === 10_001,
    warning: (code) => code === 20_001,
  },
});

定义任意协议

defineEnvelope<TBody, TValue>() 会给每个回调补全类型。

ts
const envelope = defineEnvelope<PartnerBody<User>, User>({
  read: (response) => response.body as PartnerBody<User>,
  kind: (body) => (body.success ? "ok" : "error"),
  value: (body) => body.result,
  error: (body) => new PartnerError(body.message),
});

const partner = createHttp({ adapter: "fetch", envelope });

value() 只在成功时执行,error() 返回的错误会原样抛出。

读取预期中的失败 response

默认情况下,raw() 和 blob response 也会抛 HTTP 错误。接口契约明确需要读取失败 body 时再开启:

ts
const response = await http.raw<HealthPayload>("/health", {
  ignoreResponseError: true,
});

Envelope 回调只做协议判断和数据转换。toast、路由、store 和 token 刷新放在 hooks 或调用方。

基于 MIT License 发布。