Bibliotecas cliente
Hay dos clientes oficiales generados a partir del mismo documento OpenAPI que la
referencia. Solo contienen código generado y se publican con licencia
MIT. Para cualquier otro lenguaje, genera tú mismo un cliente a partir del documento OpenAPI:
openapi.json es OpenAPI 3.1, y a su lado se publica una versión 3.0 para los
generadores que todavía no leen 3.1.
Módulo github.com/112tech/pluspanel-go:
go get github.com/112tech/pluspanel-gopackage main
import ( "context" "fmt" "log" "os"
"github.com/112tech/pluspanel-go")
func main() { c, err := pluspanel.NewWithAPIKey("https://panel.example.com", os.Getenv("PLUSPANEL_API_KEY")) if err != nil { log.Fatal(err) } res, err := c.ListServersWithResponse(context.Background(), &pluspanel.ListServersParams{}) if err != nil { log.Fatal(err) } if err := pluspanel.CheckResponse(res.HTTPResponse, res.Body); err != nil { log.Fatal(err) // a *pluspanel.Problem: Code, Detail, RequestID… } for _, s := range *res.JSON200.Items { fmt.Println(s.Id, s.Name, s.Status) }}La URL base es la dirección de tu panel; si no tiene ruta, se añade /api/v1. Los errores llegan como
problem details (pluspanel.IsProblem(err, "not_found") comprueba el código). El README del módulo
explica la paginación, las claves de idempotencia y los clientes HTTP personalizados.
TypeScript
Sección titulada «TypeScript»Paquete @pluspanel/api en npm: los tipos de la API, generados con openapi-typescript, y una capa
fina sobre el cliente tipado openapi-fetch (su única dependencia en tiempo de ejecución). Solo ESM;
Node.js 20+, Deno, Bun y navegadores.
npm install @pluspanel/apiimport { createClient, isProblem, unwrap } from "@pluspanel/api";
const api = createClient({ baseUrl: "https://panel.example.com", // /api/v1 is added when the URL has no path apiKey: process.env.PLUSPANEL_API_KEY ?? "",});
// Every page of servers.let cursor: string | undefined;do { const query = { limit: 100, ...(cursor ? { cursor } : {}) }; const page = await unwrap(api.GET("/servers", { params: { query } })); for (const s of page.items ?? []) console.log(s.id, s.name, s.status); cursor = page.next_cursor ?? undefined;} while (cursor);
// Errors are problem details: unwrap throws a ProblemError (code, detail, requestId…).try { await unwrap(api.GET("/servers/{id}", { params: { path: { id: "6f1c2d3e-…" } } }));} catch (err) { if (isProblem(err, "not_found")) console.log("gone"); else throw err;}Las rutas, los parámetros, los cuerpos y las respuestas están tipados a partir del documento OpenAPI: una
ruta o un miembro erróneo es un error de compilación. El paquete exporta también ProblemError, los
tipos paths, components y operations, y VERSION. Envía un Idempotency-Key en un POST
reintentado con { headers: { "Idempotency-Key": "…" } }.
Compatibilidad
Sección titulada «Compatibilidad»Ambos clientes siguen la política de versionado: ignoran los miembros y los valores de enumeración desconocidos, así que un plano de control más nuevo no rompe un cliente más antiguo. Actualízalos para usar operaciones nuevas.