跳转到内容
Tutorial

使用一个 POST 请求将任何 JSON 响应转换为 Zod 架构

| 5 min read

粘贴 JSON 负载,获取经过验证的 Zod 架构。 无需 CLI 安装,无需构建步骤。 适用于任何可以发出 HTTP 请求的语言。

TypeScript code in a VS Code editor
Photo by Safar Safarov on Unsplash

您访问第三方 API,获得 JSON 响应,现在您需要一个 Zod 架构。 手动流程: 盯着响应,计算字段数,找出哪些字段可以为空,处理嵌套对象, 输入 z.objectz.string() 对于每一个财产。 一个错字和你的 验证会默默地传递错误数据。

对于平坦的五场物体,这需要几分钟。 对于具有嵌套费用的 Stripe 付款意图, 元数据和 30 多个字段,需要很长时间才能让您开始质疑自己的职业选择。

波托伊 /v1/schema/json-to-zod 端点消除了这一点。 POST 任何 JSON,获得完整的 Zod 架构回来了。 一个请求,无需安装 CLI,无需配置 npm 包。

API 调用

发送 JSON 对象和可选的架构名称:

卷曲

回复:

Node.js

Python

端点接受任何有效的 JSON json 场地。 对象、数组、深度嵌套 结构; 一切正常。 这 name 字段是可选的,默认为 "Root"

真实示例:Stripe 付款意图

这是一个现实的条纹 payment_intent 嵌套响应 metadatacharges 对象。 这是一种手写 Zod 模式的有效负载 很快就会感到疼痛。

请求正文:

API 返回此 Zod 架构:

每个嵌套对象都成为自己的对象 z.object。 这 charges.data 数组产生 一个 z.array 具有正确的物品形状。 布尔值、数字和字符串是从以下位置检测到的 价值观。 将其复制到您的代码库中,添加 import { "z" } from "zod",你有 Stripe 响应的运行时验证类型可在 30 秒内完成。

也适用于 TypeScript 接口

如果您需要没有运行时验证的 TypeScript 类型, /v1/schema/json-to-typescript 端点从相同的 JSON 输入生成接口。

回复:

一样的输入格式,一样的 name 范围。 使用 json-to-zod 当你需要的时候 运行时验证(API 处理程序、表单解析、Webhook 有效负载)。 使用 json-to-typescript 当您只需要编译时类型安全时。

为您的项目构建 codegen 脚本

当您自动生成模式时,真正的力量就会显现出来。 该脚本获取实时 API 响应, 将每个转换为 Zod 模式,并将输出写入您的 src/schemas/ 目录。

#!/bin/bash
set -euo pipefail

API_BASE="https://api.botoi.com/v1"
OUTPUT_DIR="./src/schemas"

mkdir -p "\$OUTPUT_DIR"

generate_schema() {
  local name=\$1
  local url=\$2
  local output_file="\$OUTPUT_DIR/\$(echo "\$name" | tr '[:upper:]' '[:lower:]').ts"

  echo "Fetching \$url ..."
  local json_response
  json_response=\$(curl -s "\$url")

  echo "Generating Zod schema for \$name ..."
  local zod_response
  zod_response=\$(curl -s -X POST "\$API_BASE/schema/json-to-zod" \\
    -H "Content-Type: application/json" \\
    -d "{
      \\"json\\": \$json_response,
      \\"name\\": \\"\$name\\"
    }")

  local schema
  schema=\$(echo "\$zod_response" | jq -r '.data.zod')

  cat > "\$output_file" << SCHEMAEOF
import { z } from "zod";

\$schema

export type \$name = z.infer<typeof \${name}Schema>;
SCHEMAEOF

  echo "Wrote \$output_file"
}

# Add your API endpoints here
generate_schema "UserProfile" "https://api.example.com/users/1"
generate_schema "Order" "https://api.example.com/orders/latest"
generate_schema "Product" "https://api.example.com/products/42"

echo "Done. Generated \$(ls "\$OUTPUT_DIR"/*.ts | wc -l) schema files."

运行它:

Fetching https://api.example.com/users/1 ...
Generating Zod schema for UserProfile ...
Wrote ./src/schemas/userprofile.ts
Fetching https://api.example.com/orders/latest ...
Generating Zod schema for Order ...
Wrote ./src/schemas/order.ts
Fetching https://api.example.com/products/42 ...
Generating Zod schema for Product ...
Wrote ./src/schemas/product.ts
Done. Generated 3 schema files.

每个生成的文件如下所示:

将此脚本添加到您的 package.json 作为 "codegen:schemas" 并运行它 每当上游 API 发生变化时。 您的 Zod 模式与真实响应形状保持同步, 和 TypeScript 类型自动从模式派生。

当这有用时

  • 加入新的第三方 API。 点击 API 一次,将响应转换为 Zod 架构,并开始使用经过验证的类型进行构建,而不是猜测字段名称。
  • 将 JavaScript 迁移到 TypeScript。 如果您有 API 响应流经 无类型代码,从真实数据生成模式以快速获得类型覆盖率。
  • 保持架构同步。 按计划运行 CI 中的 codegen 脚本来检测 当上游 API 更改其响应形状时。
  • 原型制作。 当您需要经过验证的类型来进行概念验证并且不希望 花时间为 API 手工制作架构,你可能会在下周放弃。

FAQ

我是否需要 API 密钥才能使用 JSON 到 Zod 端点?
不需要。免费套餐允许每分钟 5 个请求的匿名访问,并具有基于 IP 的速率限制。 您无需注册即可生成 Zod 架构。 对于更高容量或 CI 管道,请将 API 密钥添加到授权标头。
我可以设置自定义架构名称而不是“Root”吗?
是的。 在请求正文中传递“名称”字段。 例如,设置 "name": "PaymentIntent" 将生成“const PaymentIntentSchema = z.object({...})”。 如果省略名称字段,则默认为“Root”。
API 是否处理嵌套对象和数组?
是的。 端点递归处理嵌套对象(z.object)、数组(z.array)和混合类型数组(z.union)。 它正确处理带有 z.nullable 和可选字段的空值。
json-to-zod 和 json-to-typescript 有什么区别?
json-to-zod 端点生成一个 Zod 架构字符串,您可以导入该字符串并将其用于运行时验证。 json-to-typescript 端点生成一个 TypeScript 接口,仅用于编译时类型检查。 当您需要类型和运行时验证时,请使用 Zod; 当您只需要编译时安全时,请使用 TypeScript 接口。
我可以在 CI 管道中使用它来从 API 响应自动生成架构吗?
是的。 编写一个脚本来获取实时 API 响应,将 JSON POST 到 botoi 端点,并将输出写入代码库中的文件。 将脚本作为 CI 步骤或预提交挂钩运行,以使您的架构与 API 保持同步。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。