@civitas-cerebrum/wasapi

中文文档
0.0.5发布于 2026/11/01MITTypeScriptCommonJS构建来源已验证近 30 天下载 2972

一个轻量级的REST API客户端库,有流畅的构建器,打入的响应,以及基于装饰器的API定义.

中文使用文档
文档目录18 节
  1. 特征
  2. 安装
  3. 快速启动
  4. 1. 用装饰器定义您的 API
  5. 2. 构建客户端
  6. 3. 执行请求
  7. API 参考
  8. 装饰者
  9. @HTTP - 自定义HTTP方法
  10. WasapiClient.Builder
  11. ApiCall<T>
  12. ApiResponse<T>
  13. ResponsePair<R, E>
  14. 例外
  15. 日志
  16. 与 Java Wasapi 的比较
  17. 重要说明
  18. 许可证

瓦萨皮..

npm

瓦萨皮 是一个轻量级的TypeScript REST API客户端库,它使用基于装饰器的API定义来简化HTTP服务生成,是一个流畅的构建器,打入的响应,以及智能的投票公用设施.

类型脚本对应的 java 时尚 ——同作设计哲学,本土TypeScript体验.

特征

  • 基于装饰器的 API 定义 —— 说 @GET, (中文(简体) ), @POST, (中文(简体) ), @PUT, (中文(简体) ), @DELETE, (中文(简体) ), @PATCH, (中文(简体) ), @HTTP
  • 流利的建设者 ——配置基础 URL,信头,超时,代理,日志
  • 输入的答复 —— 说 ApiCall<T>, (中文(简体) ), ApiResponse<T>, (中文(简体) ), ResponsePair<R, E>
  • 严格/宽大模式 - 投出失败或返回无效
  • 反应投票 —— 说 monitorResponseCode(), (中文(简体) ), monitorFieldValue()
  • 零 HTTP 依赖性 - 使用本地语言 fetch (节点18+)
  • TC39 第3阶段装饰器 没有 experimentalDecorators,没有 reflect-metadata

安装

npm install @civitas-cerebrum/wasapi

快速启动

1. 用装饰器定义您的 API

import { GET, POST, DELETE, ApiCall } from '@civitas-cerebrum/wasapi';

interface User {
  id: string;
  name: string;
  email: string;
}

class UserApi {
  @GET('/users')
  getUsers(): ApiCall<User[]> { return null!; }

  @GET('/users/:id')
  getUser(pathParams: { id: string }): ApiCall<User> { return null!; }

  @POST('/users')
  createUser(body: { name: string; email: string }): ApiCall<User> { return null!; }

  @DELETE('/users/:id')
  deleteUser(pathParams: { id: string }): ApiCall<void> { return null!; }
}

2. 构建客户端

import { WasapiClient } from '@civitas-cerebrum/wasapi';

const api = new WasapiClient.Builder()
  .setBaseUrl('https://api.example.com')
  .setHeaders({ Authorization: 'Bearer token' })
  .setLogHeaders(true)
  .build(UserApi);

3. 执行请求

// Lenient mode (default) — returns null on failure
const users = await api.getUsers().perform();

// Strict mode — throws FailedCallException on non-2xx
const users = await api.getUsers().perform(true);

// Strict + log response body
const users = await api.getUsers().perform(true, true);

// Full response wrapper
const response = await api.getUser({ id: '5' }).getResponse();
console.log(response.status);    // 200
console.log(response.body);      // User object
console.log(response.headers);   // Record<string, string>

// Typed error handling
const pair = await api.getUser({ id: 'bad' }).getResponsePair(ErrorModel);
if (pair.isError()) {
  console.log(pair.errorBody);   // ErrorModel instance
}

API 参考

装饰者

装饰说明方法参数
@GET(path)HTTP 获取(pathParams?, queryParams?, options?)
@POST(path)HTTP 邮编(body?, pathParams?, queryParams?, options?)
@PUT(path)HTTP PUT 软件(body?, pathParams?, queryParams?, options?)
@PATCH(path)哈特普・帕奇(body?, pathParams?, queryParams?, options?)
@DELETE(path)HTTP 抖音(pathParams?, queryParams?, options?)
@HTTP(method, path, hasBody?)自定义方法基于 hasBody

路径参数 使用情况 :param 语法——例如, /users/:id 替换为 pathParams: { id: '5' }。 。 。 .

查询参数 后附为 ?key=value 从 queryParams: Record<string, string>。 。 。 .

@HTTP - 自定义HTTP方法

对于非常规方法,如 PURGE, (中文(简体) ), COPY,或 LOCK数字 :

import { HTTP, ApiCall } from '@civitas-cerebrum/wasapi';

class CacheApi {
  @HTTP('PURGE', '/cache/:key')
  purge(pathParams: { key: string }): ApiCall<void> { return null!; }

  @HTTP('REPORT', '/analytics', true)  // hasBody = true
  report(body: ReportRequest): ApiCall<ReportResult> { return null!; }
}

WasapiClient.Builder

方法说明默认
setBaseUrl(url)所有请求的基准 URL所需经费
setHeaders(headers)默认信头( 按请求合并){}
setTimeout(seconds)请求超时( 秒)60
setLogHeaders(bool)日志请求信头true
setLogRequestBody(bool)日志请求正文false
setDetailedLogging(bool)日志响应机构false
setFollowRedirects(bool)跟随 HTTP 重定向false
build(ApiClass)构建已键入的 API 代理—— 说

传出 a ContextStore 实例到构建器从配置中读取默认值 :

const store = new ContextStore();
store.put('wasapi.baseUrl', 'https://api.example.com');
store.put('wasapi.timeout', 30);

const api = new WasapiClient.Builder(store).build(MyApi);

ApiCall<T>

每个装饰方法返回一个 ApiCall<T> 一个懒惰的要求描述器,它不会执行 直到你调用它的方法之一:

方法回返说明
perform(strict?, printBody?, ...errorModels)Promise<T | null>执行并还身. 严格投出失败.
getResponse(strict?, printBody?)Promise<ApiResponse<T>>完全反应包装 状态,标题,身体.
getResponsePair(ErrorClass)Promise<ResponsePair<ApiResponse<T>, E>>反应+打出错误正文.
monitorResponseCode(code, timeout, interval?)Promise<ApiResponse<T>>在 HTTP 状态匹配前进行投票 .
monitorFieldValue(field, value, timeout, interval?)Promise<T>直到反应体场对齐为止.
clone()ApiCall<T>独立副本,供重试/抽取.

ApiResponse<T>

财产/方法类型说明
statusnumberHTTP 状态代码
statusTextstringHTTP 状态文本
headersRecord<string, string>答复信头
okboolean若状态为 True, 200 - 299
bodyT | null解析过的JSON体
rawBodystring原始响应文本
isSuccessful()boolean与 ok
errorBody(ErrorClass?)E | null淡化错误正文

ResponsePair<R, E>

财产/方法类型说明
responseRAPI的回应
errorBodyE | null已键入出错正文( 成功时未显示)
isError()boolean如果错误Body不是无效, 则为真

例外

类说明
FailedCallException在非-2xx上投入了严格模式. 有过 statusCode, (中文(简体) ), responseBody, (中文(简体) ), url。 。 。 .
WasapiException一般库出错( 超时出错, 缺少配置等)

日志

使用 debug 软件包 wasapi:* 名称空间。 默认启用 .

# Suppress all wasapi logs
WASAPI_DEBUG=false npx tsx tests/my-test.ts

# Show only request logs
DEBUG=wasapi:request npx tsx tests/my-test.ts

与 Java Wasapi 的比较

爪哇语 (Retrofit)类型脚本( 此软件包)
@GET 编号 : @POST 关于接口的说明@GET 编号 : @POST 关于类方法的装饰器
retrofit.create(Service.class)builder.build(ServiceClass) ——返回代理服务器
Call<T>ApiCall<T>
Response<T>ApiResponse<T>
ResponsePair<R, E>ResponsePair<R, E>
Caller.perform(call, strict, printBody)apiCall.perform(strict, printBody)
WasapiUtilities.monitorResponseCode()apiCall.monitorResponseCode()
扩展 WasapiUtilities不需要继承 ApiCall<T>

重要说明

辩相令事. 含体方法(@POST, (中文(简体) ), @PUT, (中文(简体) ), @PATCH采取 (body, pathParams?, queryParams?, options?). 非机构方法@GET, (中文(简体) ), @DELETE采取 (pathParams?, queryParams?, options?)。TypeScript在编译时执行,但在动态构建调用时要小心.

perform() 返回时 null 宽大模式 对于空成功响应(如204)和失败请求。 如果您需要区分这些案件,请使用 getResponse() 使你饱满 ApiResponse<T> 有状态代码.

反应体是普通的 JSON 对象而不是一个阶级的例子. ApiCall<User>.perform() 返回形状为 User,没有实例 User 还有方法 这是标准的 TypeScript REST 客户端行为(与 arxios, ky等相同).

超时单位 : 构建器 setTimeout() 进入 秒数投票方法monitorResponseCode, (中文(简体) ), monitorFieldValue采取 毫秒 暂停和间隔.

通过选项格式数据 : 要通过装饰器路径发送多段请求, 请通过 formData 选项参数中:

const form = WasapiClient.getMultipartFromFile('./photo.jpg', 'avatar');
await api.uploadAvatar(undefined, undefined, { formData: form }).perform(true);

许可证

麻省理工学院

版本与发布记录

@civitas-cerebrum/wasapi 共发布 5 个版本,首次发布于 2026/04/06;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.5latest2026/11/018 天前
0.0.42026/05/086 个月前
0.0.32026/04/067 个月前
0.0.22026/04/067 个月前
0.0.12026/04/067 个月前

关于 @civitas-cerebrum/wasapi 的常见问题

@civitas-cerebrum/wasapi 是什么?

一个轻量级的REST API客户端库,有流畅的构建器,打入的响应,以及基于装饰器的API定义.

如何安装 @civitas-cerebrum/wasapi?

在项目目录运行 npm install @civitas-cerebrum/wasapi,或使用 pnpm add / yarn add / bun add。

@civitas-cerebrum/wasapi 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@civitas-cerebrum/wasapi 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@civitas-cerebrum/wasapi 可以商用吗?

@civitas-cerebrum/wasapi 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@civitas-cerebrum/wasapi 的下载量有多少?

根据 npm 官方下载统计,@civitas-cerebrum/wasapi 在 2026/10/10 – 2026/11/08 这 30 天内被下载 2,972 次,日均约 99 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@civitas-cerebrum/wasapi 还在维护吗?

最新版本 0.0.5 发布于 2026/11/01(8 天前);至今共发布 5 个版本,其中过去 12 个月发布了 5 个;首次发布于 2026/04/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。