Design SDK e supporto linguistico
1) Obiettivi SDK e criteri di successo
Developer Experience (DX) - API intuitive, un'unica semantica tra lingue.
Affidabilità: timeout/retrai/idampotenza da scatola.
Sicurezza: segreti, firme, TLS, compatibilità con ambienti proksi/企业.
Osservabilità: fogli, metriche, piste in strumenti standard per la lingua.
Economia: minimo egress/CPU, paginazione efficiente, batch.
Stabilità: severo semver, compatibilità inversa, rami LTS.
2) Principi architettonici
1. Thin client, strong contracts: avvolgimento SDK sopra il protocollo (REST/gRPC), senza logica aziendale nascosta.
2. Unified surface: concetti identici (Client, Richiest, Response, Errore, Paginator, WebhookVerifier).
3. Safe by default: timeout ragionevole, backoff esponenziale + jitter, protezione contro le ripetizioni.
4. Config layering: il file ENV Il costruttore i parametri del metodo.
5. Pluggable Transfer: HTTP/gRPC sostituibili, compatibili con connessioni proksi/池.
6. Testability: interfacce/falsità, dipendency injection, record-replay.
7. I18n errori: la macchina «error _ code» è stabile; i messaggi sono localizzabili.
8. Accessibility: opzioni asincrone (solitamente «AsyncClient») se necessario.
9. Sicurezza-first - I segreti non entrano nella redazione PII, cryptobiblioteche compatibili FIPS se necessario.
3) Tabella di supporto e parità di funzionalità
4) Superficie API di base (modello canonico)
Entità generali
Client - Configurazione di trasporti, chiavi, retrai, telemetri hooks.
Richiest/Response: modelli di sicurezza/DTO, paginazione/cursori.
Errore: un'unica classe con «status», «error _ code», «trace _ id», «retriable».
Paginator/Iterator: eccesso pigro di pagine/cursori.
, controllo del , per «event _ id».
Mini-esempio (TypeScript)
ts const client = new GambleHubClient({
apiKey: process. env. GH_API_KEY!,
timeoutMs: 10_000,
retries: { max: 5, strategy: "expo-jitter" }
});
const { items, nextCursor } = await client. reports. list({ from, to, cursor });
for await (const report of client. reports. iter({ from, to })) { /... / }
Mini esempio (Python, async)
py from gamblehub import AsyncClient, WebhookVerifier
client = AsyncClient(api_key=API_KEY, timeout=10, retries={"max":5})
async for user in client. users. iter(updated_after=ts):
...
verifier = WebhookVerifier(secret=WEBHOOK_SECRET)
if verifier. verify(headers, body): ack()
5) Configurazione e ambiente di esecuzione
ENV: `GH_API_KEY`, `GH_ENDPOINT`, `GH_TIMEOUT_MS`, `HTTP_PROXY/HTTPS_PROXY`, `GH_REGION`.
Struttura - Ridefinisce l'ENV.
Per-call overrides: timeout/retrai a livello di metodo.
TLS/mTLS: percorso del certificato/chiave, pinning CA se necessario.
Pool di connessione: keep-alive, HTTP/2, vincolo di parallelismo.
6) Sicurezza dalla scatola
I segreti non sono logici, nascosti in stack traces; redaction ``.
Etichette: HMAC per webhook, X-Key-ID/rotazione chiavi, supporto per due chiavi active/next.
Idempoted: installazione trasparente dì Idempotency-Key "per le operazioni write (il riavvio è sicuro).
RBAC/Scopes: elencazioni/costanti comode per scrocchi.
Criteri PII - Interfacce di modifica standard per la logica.
7) Affidabilità: timeout, retrai, back-off
Timeout predefinito: 10-15s; Connect 3-5s.
Retrai: per 5xx/408/429 (rispettare Retry-After), backoff esponenziale + jitter, limite di tentativi/tempo.
Circuito-breaker: opzionale in SDK (o raccomandazioni per libere di terze parti).
Write idipotente: ripetizione automatica della chiave; i collisioni → a sollevare «409 IDAMP _ REPLAY».
8) Paginazione, cursori e streaming
Puntatore/iteratore: eccesso pigro, ripetizioni automatiche in caso di errori transitori.
Paginazione Keyset: sistemazione stabile '(updated _ at, id)'.
Backpressure: limite delle richieste simultanee в async-SDK — `async for`/`channels`.
Lo streaming (dove disponibile) è un SSE/WebSocket/gRPC-stream con l'auto-reconnect e la deducibilità per sequence.
9) Errori e contratto
Un'unica gerarchia:- `ApiError` (базовый) → подтипы: `AuthError(401)`, `PermissionError(403)`, `NotFound(404)`, `Conflict(409)`, `RateLimit(429)`, `ValidationError(422)`, `ServerError(5xx)`.
- Свойства: `status`, `error_code`, `message`, `trace_id`, `retriable`, `details`.
- Best practice: i messaggi sono umani, 'error _ code' è stabile.
10) Idiomi linguistici
TypeScript/JS
Promise-based + generatori di paginazione; pacchetti ESM + CJS.
Tree-shaking, polifili minimi, segnali abort ('AbortController').
Python
Sync + Async (aiohttp/httpx), contesto manager, modelli «pydantic» (o dataclasses).
Wheels для linux/macos/windows; supporto proxies/NO _ PROXY.
Java
«CompletableFuture», «AutoCloseable», «Duration», «Execuutor».
HTTP client: `java. net. http 'o OkHttp; SLF4J per le unità.
Go
Contesti dì text. Context`, `http. Client "con tuned Transfer, interfacce per i test.
Error wrapping (`fmt. Errorf («% w», err) '), semantica degli errori sentinel.
.NET
`HttpClientFactory`, `CancellationToken`, `IAsyncEnumerable<T>`.
Criteri Polly (retry/circuito-breaker).
... e così via per PHP/Ruby (PSR-18, Faraday/Net:: HTTP).
11) Loging, metriche, traccia
Loghi: livelli (ERRORE/WARN/INFO/DEBUG), corellazione «trace _ id», disattivazione dei dati sensibili.
Метрики: `requests_total`, `errors_total{status}`, `retry_count`, `latency_ms`, `throttled_total`.
Piste: OpenTelemetry hooks (span per la chiamata API, attributi endpoint, status, retry).
Debug-mode: variabile ambiente «GH _ SDK _ DEBUG = 1» - Stampa intestazioni HTTP (senza segreti) e tempi.
12) Documentazione e esempi
Quickstart 5 minuti: auth, prima richiesta, paginazione, trattamento 429.
Cookbook: webhook (controllo della firma), write idipotente, repliche.
L'API è un gene automatico dal OpenAPI/Protobuf, ma con esempi «manuali».
Snippets: parti di codice pronte per attività popolari (Python/TS/Java/Go/.NET).
13) Generazione vs codifica manuale
Approccio combinato: codegen (modelli/client) + maniglie per ergonomics/idampotenza/paginatori.
Modelli: un unico nome di metodo ('create/get/list/update/delete'), stab. Le firme.
Verifica della compatibilità dopo il regen (CI-gate).
14) Versioning, compatibilità e deprecazione
X.Y.Z. Rompitore - solo maggiore.
Politica di stabilità: rilasci minori - aggiungere campi/metodi, non cambiare i contratti.
Deprecation: annotazioni/attributi @ Deprecated/Obsolete, avvisi in un RENT una volta per processo, finestra per 90 giorni.
Rami LTS: backport dei critici (senza nuovi files).
15) Release e catena di fornitura
CI/CD: lenti/formattatori, unità + integrazione, test di contratto, e2e contro arenaria.
Firma manufatti Sigstore/GPG, checksums sui rilasci.
Pubblicazione: npm/PyPI/Maven/NuGet/Go/Composer/RubyGems con changelog e note release.
SemVer gate: verifica automatica della compatibilità dell'API pubblica (ad esempio, «apiregistry differf»).
16) Test (matrice di qualità)
Unità: modelli, serializzazione, validazione, retrai/timeout.
Contract contro gli schemi di OpenAPI/Protobuf (negative/edge case).
Integration: contro sandbox (idampotenza, 429/5xx, webhooks).
Load/soak: paginazione/strame, backpressure.
Fuzz: campi/intestazioni/limiti di tempo.
Compat: le vecchie API SDK sono nuove e viceversa.
Smoke-pack: 5 minuti per catturare la regressione in CI.
17) Politiche di telemetria e privacy
Opzionale-opt-in - Raccolta di metriche SDK aggregate (versione, lingua, stato) senza PII.
Config: 'telemetry: off' anonymized'full '(predefinito off/anonymized).
Trasparenza: documentare cosa e perché lasciamo la casella di disattivazione.
18) Prestazioni e FinOps
Batching - Unire le richieste minori Limitare RPS gzip/br.
Cache ETag/If-None-Match condizionati da GET.
Modelli economici: iteratori pigri invece di caricare tutto nella memoria.
Parallelismo con il limite dì max _ concertency "per non DDOSyt API.
19) Componenti SDK tipici (scheletri)
Error (TypeScript)
ts export class ApiError extends Error {
constructor(
readonly status: number,
readonly errorCode: string,
readonly traceId?: string,
readonly retriable?: boolean,
readonly details?: unknown
) { super(`${status} ${errorCode}`); }
}
Paginatore (Python)
py class Paginator(Generic[T]):
def __init__(self, fetch_page):
self._fetch = fetch_page self._cursor = None async def __aiter__(self):
while True:
page = await self._fetch(self._cursor)
for item in page. items:
yield item if not page. has_more: break self._cursor = page. next_cursor
WebhookVerifier (Go)
go func Verify(body []byte, signatureHeader, secret string) bool {
parts:= strings. SplitN(signatureHeader, "=", 2)
mac:= hmac. New(sha256. New, []byte(secret))
mac. Write(body)
expected:= base64. StdEncoding. EncodeToString(mac. Sum(nil))
return hmac. Equal([]byte(parts[1]), []byte(expected))
}
20) Supporto, SLA e comunità
SLA SDK: bagi critici - fix ETA, canali di comunicazione, matrice di compatibilità (SDK↔API).
Issue templates: bug/feature/question, auto-triage per lingua/versione.
Roadmap/labels: «good first issue», «help wanted».
Security policy: `SECURITY. md, canale per i rapporti di vulnerabilità, CVE se necessario.
21) Assegno di qualità SDK
- Un unico errore modello ('status', 'errore _ code', 'trace _ id', 'retriable').
- Timeout/retrai/jitter, rispetto «Retry-After».
- Idampotenza write, automatica «Idempotency-Key».
- Paginazione con cursore, iteratori/striam pigri.
- con e .
- Configurazione tramite ENV/costruttore/impostazioni.
- Loging/metriche/OTel-gancio, modalità debug senza segreti.
- SemVer, depositi di ≥90 giorni, rami LTS.
- Esempi completi e cookbook per attività popolari.
- Matrice di parità Fich tra lingue in CI.
22) Piano di implementazione (3 iterazioni)
1. MVP (2-3 settimane): Client di base, auth, 3-5 endpoint chiave, paginazione, unico errore modello, retrai/timeout TS+Python.
2. Scale (3-5 settimane): Java/Go/.NET, WebhookVerifier, idipotenza write, telemetria hooks, generazione di modelli da OpenAPI.
3. Pro (continuativo): streaming/SSE/grPC, ottimizzazione perf, rami LTS, cookbook esteso, strumenti di migrazione/deprecazione.
23) Mini FAQ
Generare tutto o scrivere con le mani?
Generare modelli/client e ergonomics (paginatori, retrai, idemotia, firme) manualmente.
È necessario un async-SDK separato?
В Python — да (`AsyncClient`); JS - predefinito NET/Java - chiamate asincrone se possibile.
Come mantenere la parità di lingue?
Matrix Fich in CI, rilascio «Per i buchi» (TS→Py→Java→Go→.NET) con «che è indietro».
Totale
Il forte SDK è un'unica superficie, default affidabili e contratti prevedibili, uguali in tutte le lingue. Fornite agli sviluppatori impostazioni sicure da scatolone, modello di errore comprensibile, paginazione e verifica dei siti Web, completate con documentazione di qualità e severa semver. In tal caso, le integrazioni saranno rapide, il supporto sarà economico e l'ecosistema sostenibile e scalabile.