Skip to content

协议实验台

这个页面直接在浏览器运行仓库里的 createHttp。场景数据经过真实 hooks、response policy 和 error pipeline。

协议实验台

后端响应如何转换为业务数据或 BizError

选择一种后端响应,运行仓库里的真实 createHttp,对比原始 response 与 Promise resolve/reject 的最终结果。

真实 envoi clientcreateHttp()
场景Envelope 成功解包 data
真实请求管线HTTP 200 · OK
后端 responseOK
HTTP 200
{
  "status": 200,
  "body": {
    "code": 200,
    "msg": "ok",
    "data": {
      "id": 42,
      "name": "Ada"
    }
  }
}
envoi 输出
等待运行
// 运行后在这里查看 resolve 值或 BizError
解包 data等待运行

每个场景验证什么

Envelope 成功

HTTP 200 加明确配置的 { code, msg, data } policy,最终 resolve 的值是 User

业务错误

HTTP 请求成功,业务 code 失败,Promise reject 为 BizError。直接使用 axios 时,这类 response 会 resolve。

HTTP-only body

省略 envelope 后返回解析完成的 body,成功与否只看 HTTP status。

字段改名

Envelope map 读取 errnoerrmsgresult,API 函数不用跟着后端字段改名。

HTTP 503

HTTP status 优先。body 里残留的 code: 200 不会把 HTTP 503 变成成功。

Demo 使用的 adapter

Demo 注入一个小型 adapter,再交给配置的 hooks、response policy 和 error pipeline。

ts
const adapter: Adapter = {
  name: "protocol-lab",
  async request() {
    return {
      status: scenario.status,
      statusText: scenario.statusText,
      headers: { "x-demo": "protocol-lab" },
      body: scenario.body,
    };
  },
};

const client = createHttp({
  adapter,
  envelope: scenario.envelope,
});

const result = await client.get<User>("/demo");

axios、native fetch、ofetch、native bridge 和测试 adapter 都遵守这份 contract。

基于 MIT License 发布。