Pular para o conteúdo
Tutorial

Converta qualquer resposta JSON em um esquema Zod com uma solicitação POST

| 5 min read

Cole uma carga JSON e obtenha de volta um esquema Zod validado. Nenhuma instalação CLI, nenhuma etapa de construção. Funciona em qualquer linguagem que possa fazer solicitações HTTP.

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

Você acessa uma API de terceiros, obtém uma resposta JSON e agora precisa de um esquema Zod para isso. O processo manual: observe a resposta, conte os campos, descubra quais são anuláveis, manipule objetos aninhados, digite z.object e z.string() para cada propriedade. Um erro de digitação e seu a validação passa silenciosamente dados incorretos.

Para um objeto plano de cinco campos, isso leva alguns minutos. Para uma intenção de pagamento Stripe com cobranças aninhadas, metadados e mais de 30 campos, leva tempo suficiente para você começar a questionar suas escolhas de carreira.

O botoi /v1/schema/json-to-zod endpoint elimina isso. POST qualquer JSON, obtenha um completo Esquema Zod de volta. Uma solicitação, sem CLI para instalar, sem pacote npm para configurar.

A chamada da API

Envie um objeto JSON e um nome de esquema opcional:

enrolar

Resposta:

Node.js

Pitão

O endpoint aceita qualquer JSON válido no json campo. Objetos, matrizes, profundamente aninhados estruturas; tudo funciona. O name campo é opcional e o padrão é "Root".

Exemplo real: uma intenção de pagamento Stripe

Aqui está uma listra realista payment_intent resposta com aninhado metadata e charges objetos. Este é o tipo de carga útil onde esquemas Zod escritos à mão fica doloroso rapidamente.

Corpo da solicitação:

A API retorna este esquema Zod:

Cada objeto aninhado se torna seu z.object. O charges.data matriz produz um z.array com o formato correto do item. Booleanos, números e strings são detectados a partir de os valores. Copie isso em sua base de código, adicione import { "z" } from "zod", e você tem tipos validados em tempo de execução para respostas Stripe em menos de 30 segundos.

Também funciona para interfaces TypeScript

Se você precisar de tipos TypeScript sem validação de tempo de execução, o /v1/schema/json-to-typescript endpoint gera interfaces a partir da mesma entrada JSON.

Resposta:

Mesmo formato de entrada, mesmo name parâmetro. Usar json-to-zod quando você precisar validação de tempo de execução (manipuladores de API, análise de formulário, cargas úteis de webhook). Usar json-to-typescript quando você só precisa de segurança do tipo em tempo de compilação.

Crie um script codegen para seu projeto

O verdadeiro poder aparece quando você automatiza a geração de esquemas. Este script busca respostas da API ao vivo, converte cada um em um esquema Zod e grava a saída em seu src/schemas/ diretório.

#!/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."

Executando:

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.

Cada arquivo gerado se parece com isto:

Adicione este script ao seu package.json como "codegen:schemas" e executá-lo sempre que a API upstream for alterada. Seus esquemas Zod permanecem sincronizados com o formato de resposta real, e os tipos TypeScript são derivados do esquema automaticamente.

Quando isso é útil

  • Integrando uma nova API de terceiros. Acesse a API uma vez e converta a resposta em um Zod esquema e comece a construir com tipos validados em vez de adivinhar nomes de campos.
  • Migrando JavaScript para TypeScript. Se você tiver respostas de API fluindo código não digitado, gere esquemas a partir de dados reais para obter cobertura de tipo rapidamente.
  • Mantendo os esquemas sincronizados. Execute o script codegen no CI de acordo com uma programação para detectar quando uma API upstream altera seu formato de resposta.
  • Prototipagem. Quando você precisar de tipos validados para uma prova de conceito e não quiser gastar tempo criando esquemas para APIs que você poderá descartar na próxima semana.

FAQ

Preciso de uma chave de API para usar o endpoint JSON para Zod?
Não. O nível gratuito permite acesso anônimo a 5 solicitações por minuto com limitação de taxa baseada em IP. Você pode gerar esquemas Zod sem se inscrever. Para volumes maiores ou pipelines de CI, adicione uma chave de API ao cabeçalho de autorização.
Posso definir um nome de esquema personalizado em vez de "Root"?
Sim. Passe um campo "nome" no corpo da solicitação. Por exemplo, definir "name": "PaymentIntent" produzirá "const PaymentIntentSchema = z.object({...})". Se você omitir o campo de nome, o padrão será "Root".
A API lida com objetos e matrizes aninhados?
Sim. O endpoint processa recursivamente objetos aninhados (z.object), matrizes (z.array) e matrizes de tipo misto (z.union). Ele lida com valores nulos com campos z.nullable e opcionais corretamente.
Qual é a diferença entre json-to-zod e json-to-typescript?
O endpoint json-to-zod produz uma string de esquema Zod que você pode importar e usar para validação de tempo de execução. O endpoint json-to-typescript produz uma interface TypeScript apenas para verificação de tipo em tempo de compilação. Use Zod quando precisar de tipos e validação de tempo de execução; use interfaces TypeScript quando precisar apenas de segurança em tempo de compilação.
Posso usar isso em um pipeline de CI para gerar esquemas automaticamente a partir de respostas de API?
Sim. Escreva um script que busque uma resposta de API ao vivo, faça um POST do JSON no endpoint botoi e grave a saída em um arquivo em sua base de código. Execute o script como uma etapa de CI ou um gancho de pré-confirmação para manter seus esquemas sincronizados com a API.

Comece a construir com botoi

150+ endpoints de API para consultas, processamento de texto, geração de imagens e utilitários para desenvolvedores. Plano gratuito, sem cartão de crédito.