Sari la conținut

Biblioteci client

Doi clienți oficiali sunt generați din același document OpenAPI ca referința. Conțin doar cod generat și sunt publicați sub licența MIT. Pentru orice alt limbaj, generează-ți singur un client din documentul OpenAPI: openapi.json este OpenAPI 3.1, iar lângă el este publicată și o versiune 3.0, pentru generatoarele care nu citesc încă 3.1.

Modulul github.com/112tech/pluspanel-go:

Terminal window
go get github.com/112tech/pluspanel-go
package 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)
}
}

URL-ul de bază este adresa panoului tău; /api/v1 se adaugă când nu are cale. Erorile vin ca problem details (pluspanel.IsProblem(err, "not_found") testează codul). README-ul modulului descrie paginarea, cheile de idempotență și clienții HTTP personalizați.

Pachetul @pluspanel/api din npm: tipurile API-ului, generate cu openapi-typescript, și un strat subțire peste clientul type-safe openapi-fetch (singura lui dependență la rulare). Doar ESM; Node.js 20+, Deno, Bun și browsere.

Terminal window
npm install @pluspanel/api
import { 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;
}

Căile, parametrii, corpurile și răspunsurile sunt tipizate din documentul OpenAPI: o cale sau un membru greșit este o eroare de compilare. Pachetul exportă și ProblemError, tipurile paths, components și operations, precum și VERSION. Trimite un Idempotency-Key la un POST reîncercat cu { headers: { "Idempotency-Key": "…" } }.

Ambii clienți respectă politica de versionare: ignoră membrii și valorile de enumerare necunoscute, deci un control plane mai nou nu strică un client mai vechi. Actualizează-i ca să folosești operațiile noi.