尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深入 @scalar/void-server:Scalar 开源 HTTP 请求镜像服务器的设计与演进

深入 @scalar/void-server:Scalar 开源 HTTP 请求镜像服务器的设计与演进 深入 scalar/void-serverScalar 开源 HTTP 请求镜像服务器的设计与演进【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalar本篇文章以scalar/void-server的版本变更记录CHANGELOG.md为主线结合其 README.md 与源码实现系统讲解 Scalar 开源 API 平台中这个请求镜像Echo服务器的完整能力。你将掌握它的安装与启动方式、JSON/HTML/XML/ZIP/SSE 等多样化的响应机制、HTTP 错误码路由、WebSocket 回显、安全加固手段以及它从 2.0.0 到 2.5.9 的演进脉络与背后工程决策可以直接用它调试 API 客户端、验证代理与网关行为。Void Server 是什么为 HTTP 请求照镜子从 README.md 的定义看void-server 是一个基于 Hono 的服务器它的核心行为只有一句话把收到的请求数据原样回显给你An Hono server that responds with the request data. Kind of a mirror for HTTP requests.。它解决的是一个非常实际的工程痛点当你调试 API 客户端、SDK、代理或网关时常常需要一个固定目标来确认请求到底发出了什么——方法、路径、请求头、Cookie、查询参数、认证信息、请求体。void-server 就是这个目标任何请求打进来它都会把完整快照作为响应返回让你一眼看清请求的真实面貌。其 package.jsonpackages/void-server/package.json将自身定位描述为 Mirror for HTTP requests关键词包括scalar、http testing、hono。官方还维护了一个公开部署实例供直接体验见 README你可以把它当作临时调试靶场。快速上手安装与最小启动示例安装需要 Node.js 22见 package.json 的engines字段该要求自 2.4.0 起生效npm add scalar/void-server最小启动示例完整继承自 README.mdimport { serve } from hono/node-server import { attachVoidWebSocket, createVoidServer } from scalar/void-server const app createVoidServer() const httpServer serve( { fetch: app.fetch, port: 3000, }, (info) { console.log(Listening on http://localhost:${info.port}) console.log(WebSocket echo at ws://localhost:${info.port}/any-path) }, ) attachVoidWebSocket(httpServer)启动后访问任意路径即可获得请求数据的 JSON 快照例如http://localhost:3000/—— 返回请求数据的 JSON 展示http://localhost:3000/404—— 返回 404 状态与对应错误文本http://localhost:3000/foobar.html—— 返回 HTML 格式的请求快照http://localhost:3000/foobar.xml—— 返回 XML 格式的请求快照http://localhost:3000/foobar.zip—— 返回包含request.json的 ZIP 压缩包http://localhost:3000/?foobarfoorab—— 演示查询参数数组foo同时携带两个值ws://localhost:3000/any-path—— WebSocket 回显连接默认 60 秒后关闭仓库自带的开发入口 playground/index.ts 展示了同样的模式通过环境变量HOST默认0.0.0.0与PORT默认8080启动服务并同时挂载 WebSocket 回显。请求镜像的底层实现getRequestData所有请求最终都会经过 get-request-data.ts 汇聚成统一的数据结构该结构包含以下字段字段说明methodHTTP 方法GET/POST/PUT/DELETE 等path请求路径headers全部请求头由Object.fromEntries(c.req.raw.headers)展开authentication解析后的认证信息见下文cookies由 Hono 的getCookie解析出的 Cookie 对象query查询参数数组参数保持为数组单个值则归一为字符串body请求体自动按内容类型解析认证信息的自动解析源码对Authorization请求头做了两类识别get-request-data.tsBasic 认证当请求头以Basic开头时输出type: http.basic、原始token并借助依赖js-base64的decode解出明文的valueBearer 认证当请求头以Bearer开头时输出type: http.bearer与原始token。这让你可以验证客户端是否正确编码/携带了凭证而无需真实后端参与。查询参数数组从 2.0.11 起支持查询参数数组对应 CHANGELOG 中 feat: query parameter arrays。实现上先调用c.req.queries()拿到所有参数再对每个 key 判断若值多于一个则保留为数组否则退化为单值字符串get-request-data.ts。因此?foobarfoorab会得到foo: [bar, rab]。请求体解析JSON / 文本 / 表单 / 文件上传get-body.ts 按Content-Type分流解析请求体application/x-www-form-urlencoded或multipart/form-data调用 Hono 的parseBody({ dot: true, all: true })随后经过transformFormData规整解析失败时静默返回空对象其余情况先按文本读取再尝试JSON.parse成功则返回 JSON 对象失败则保留原始文本。transformFormData对表单值做了类型化处理get-body.ts字符串原样保留File实例会被转换为{ name, sizeInBytes, type, lastModified }结构lastModified由时间戳转为 ISO 字符串数组中的文件项同样逐个转换嵌套对象递归处理。这是 2.0.3 form data and multipart form data 特性的具体落地适合用来检查 SDK 上传文件的字段名、MIME 类型与大小。多样化的响应格式JSON、HTML、XML 与 ZIPvoid-server 最核心的使用场景是按需返回不同格式的请求快照。路由策略在 create-void-server.ts 中实现分为两层1. 基于文件扩展名强制格式2.0.4 起路径以.html、.xml、.zip、.json结尾时直接按对应格式返回正则/:filename{.\\.(html|xml|json|zip)$}JSONcreateJsonResponse直接c.json(data)这是默认格式HTMLcreateHtmlResponse设置Content-Type: text/html用 Hono 的html标签模板递归渲染对象树create-html-response.ts键与值均经过自动转义以防御 XSS这也是 2.3.0 escape html and xml, add security headers 的核心内容之一XMLcreateXmlResponse通过工作区依赖scalar/helpers提供的json2xml转换并显式返回Content-Type: application/xml; charsetUTF-8create-xml-response.ts。配套的转义逻辑同样来自 2.3.0 与 2.2.2 的 better xml rendering2.2.5 修复了重复的 XML 定义2.0.14 修复了缺失 XML 头的问题ZIPcreateZipFileResponse不依赖第三方压缩库而是手工按 ZIP 二进制格式拼装create-zip-file-response.ts写入本地文件头签名0x04034b50、文件名为request.json的文件内容格式化 JSON、中央目录头签名0x02014b50与目录结束记录签名0x06054b50并自行实现了 CRC-32 校验表多项式0xEDB88320计算文件校验值。2.4.7 的修复fix zip responses to return a valid archive with request JSON payload确保了产物是能被标准解压工具识别的合法压缩包。2. 基于 Accept 头的内容协商对于不以扩展名结尾的普通路径app.all(/*)使用 Hono 的accepts工具按Accept请求头协商create-void-server.ts支持text/html、application/xml、application/zip默认回落到application/json。也就是说同一个 URL 可以因客户端声明的 Accept 不同而返回不同格式——非常适合测试内容协商逻辑。HTTP 状态码路由任意 4xx/5xx 即点即得从 2.0.3 起routes for all HTTP errors e.g. /503void-server 提供了一条通配路由app.all(/:status{[4-5][0-9][0-9]})create-void-server.ts任何形如4xx或5xx的路径都会以该数字作为 HTTP 状态码返回。状态文本来自 constants.ts 中维护的错误码映射表覆盖 400511 的常见状态例如400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found418 Im a teapot、429 Too Many Requests、451 Unavailable For Legal Reasons500 Internal Server Error、502 Bad Gateway、503 Service Unavailable、504 Gateway Timeout映射表中未覆盖的状态码如 405、420、425 等会回退为Unknown Error。此外2.0.10 引入了独立的/:status{204}路由返回空响应体c.body(null, 204)见 create-void-server.ts便于测试客户端对 204 No Content 的处理。流式响应SSE 与 WebSocket 回显/stream服务端事件SSE长连接2.1.0 引入/stream端点用于测试 SSE 客户端。实现见 create-stream-response.ts设置Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive三个头后通过 Hono 的stream每秒写入一行data: ping永不结束。2.4.5 的修复fix stream endpoint headers for server-sent events正是针对这批 SSE 响应头。attachVoidWebSocket任意路径的 WebSocket 回显2.5.0 是 WebSocket 能力的里程碑feat: add WebSocket echo endpoint with connection timeout。核心实现位于 void-websocket.ts基于ws库的WebSocketServer({ noServer: true })在已有 Node HTTP 服务器上监听upgrade事件只有带Upgrade: websocket头的请求才会被处理其余升级请求直接socket.destroy()默认接受任意路径与 HTTP 侧镜像一切的语义一致指定path时按 URL 去掉查询串后的路径精确匹配连接建立后message事件把收到的文本或二进制帧原样回发ws.send(data, { binary: isBinary })即回显每个连接绑定一个超时定时器到点后以 1000 状态码关闭Connection timeout并在error/close时清理定时器避免长驻服务堆积空闲 socket。重复调用幂等attachVoidWebSocket通过 Symbol 标记VOID_WEBSOCKET_SERVER把WebSocketServer挂在 HTTP 服务器上第二次调用直接返回已有实例不会重复注册监听器且后续传入的选项会被忽略见 void-websocket.ts 及 README 说明。WebSocket 选项如下选项说明path限定接受的升级路径默认接受任意路径connectionTimeoutMs连接最大存活时长毫秒。未传、为 0 或负数时回退到环境变量VOID_WEBSOCKET_TIMEOUT_MS再回退到默认值 60 秒DEFAULT_VOID_WEBSOCKET_TIMEOUT_MS 60_000见 void-websocket.tsattachVoidWebSocket(httpServer, { path: /ws, connectionTimeoutMs: 30_000, })配套测试位于 void-websocket.test.ts覆盖回显与超时行为。安全与可观测性安全头、CORS 与请求日志安全头与逃逸2.3.02.3.0 是安全相关的关键版本feat: escape html and xml, add security headers, add more testsCORS所有请求默认启用 Hono 的cors()中间件安全响应头在 create-void-server.ts 中通过中间件为所有响应追加X-Content-Type-Options: nosniff与Content-Security-Policy: default-src none; style-src unsafe-inlineXSS 防护HTML 响应的键值由 Honohtml标签模板自动转义XML 响应经由scalar/helpers的json2xml转义对应 helpers 的 feat: escape XML in json2xml。请求日志与 logger 选项2.5.2Void Server 默认在 CI 之外启用 Hono 请求日志app.use(honoLogger(...))见 create-void-server.ts。2.5.2 为createVoidServer增加了logger选项类型为boolean | 日志回调默认行为options.logger ?? !process.env.CI即 CI 环境下自动关闭本地开发自动开启false当你的平台如托管服务、网关已经采集请求日志时关闭内置日志true强制使用 Hono 默认 logger函数自定义日志写入目标例如(line) console.info(line)。// 关闭日志 const app createVoidServer({ logger: false }) // 自定义日志输出 const app createVoidServer({ logger: (line) console.info(line) })版本演进时间线从 2.0.0 到 2.5.9CHANGELOG 完整记录了该包的演进。按主题归纳如下版本主题关键变更2.0.0初始版本包首次发布init2.0.1响应格式新增 HTML 与 XML 响应2.0.2工程化TypeScript 升级到 5.52.0.3表单与错误路由支持表单与 multipart 表单数据新增全部 HTTP 错误路由如/5032.0.4扩展名路由.json路径强制 JSON 响应.xml路径强制 XML 响应2.0.5 / 2.0.9Node 兼容修复 Node 18 无全局File、file undefined问题2.0.7 / 2.0.8依赖清理移除 undici 依赖、移除node:buffer导入、修正 package.json 目录2.0.10状态码路由/204返回空响应体2.0.11查询参数支持查询参数数组2.0.12/2.0.13类型安全增加默认导出启用noUncheckedIndexedAccess2.0.14XML 修复修复缺失 XML 头2.0.16/2.0.17工程化更严格的 TS 配置修复 Docker 部署2.1.0日志与 SSE采用 Hono logger新增/stream服务端事件端点2.1.1构建构建工具迁移到 esbuild2.2.0运行时要求要求 Node 20 及以上2.2.1/2.2.2输出细节统一直撇号支持 base64 Unicode 字符优化 XML 渲染2.2.5XML 修复修复重复 XML 定义2.3.0安全加固HTML/XML 逃逸、安全响应头、新增更多测试2.4.0运行时要求Node 版本要求提升到 22LTS2.4.3构建流水线新的构建流水线2.4.5SSE 修复修复服务端事件响应头2.4.7ZIP 修复修复 ZIP 响应以返回包含请求 JSON 载荷的合法压缩包2.5.0WebSocket新增 WebSocket 回显端点与连接超时2.5.2可配置性createVoidServer支持 logger 选项2.5.3发布工程重新发布以修正 npm 上[object Object]的 READMEpackage.json的 README 生成元数据字段由readme更名为scalarReadme2.5.4/2.5.5文档更新 README 中的 Scalar 平台概览2.5.6/2.5.7/2.5.8发布工程通过 npm trusted publishing 重新发布全部包无功能变化此外包持续依赖工作区内的scalar/helperspackages/helpers其历次更新如 v1 本地存储到 v2 IndexedDB 迁移器、history/auth 独立 store、认证持久化修复、代理重定向导入导出修复等也会随版本同步进入 void-server 的变更记录中体现了 monorepo 依赖管理的连锁升级机制。源码结构导览想深入阅读实现可从以下文件入手src/create-void-server.tscreateVoidServer主入口路由与中间件编排src/void-websocket.tsattachVoidWebSocket与超时机制src/utils/get-request-data.ts请求快照汇聚src/utils/get-body.ts请求体解析src/utils/create-html-response.ts / create-xml-response.ts / create-zip-file-response.ts / create-stream-response.ts四种特殊响应格式src/utils/constants.tsHTTP 错误码映射src/create-void-server.test.ts 与 src/void-websocket.test.ts核心行为测试结语scalar/void-server以请求镜像这一极简理念借助 Hono 生态实现了从 JSON 快照、多格式回显、状态码路由到 SSE 与 WebSocket 回显的完整调试能力并通过 2.3.0 的安全加固、2.5.0 的 WebSocket 超时与 2.5.2 的日志可配置化逐步打磨成一个可生产部署的 HTTP 测试基础设施。它的版本历史本身就是一份优秀的最小化服务演进范本功能按需生长、运行时要求随 LTS 同步升级、发布工程问题持续修正。无论是接入 API 客户端开发调试还是作为 CI 中的代理验证靶场它都是一个轻量而可靠的选择。【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表