GunSpec
Praxis

SDK-Muster in TypeScript und Python

Die Verdrahtung um die Aufrufe: ein Client je Prozess, Wiederholungen und Revalidierung einmal konfiguriert, Auto-Paging, typisierte Fehler und Rohbytes.

Beide SDKs lesen den Schlüssel aus der Umgebung, er läuft also nie durch Ihren eigenen Code. Bauen Sie den Client auf Modulebene und teilen Sie ihn: jede Instanz hält eigenen Connection-Pool, eigenes Retry-Budget und eigenen ETag-Speicher, und ein Client je Anfrage wirft alle drei jedes Mal weg. Die SDK-Referenz dokumentiert jede Methode.

client
TypeScript
import { GunSpec, MemoryETagStore } from '@buun_group/gunspec-sdk' // One client per process, built once and shared. Each instance keeps// its own connection pool, retry budget and ETag store, so a client// per request throws all three away on every request.export const gunspec = new GunSpec({  apiKey: process.env.GUNSPEC_API_KEY,  timeout: 10_000,  // Transient failures only, with backoff and jitter. Terminal  // answers are never retried.  retry: { maxRetries: 3 },  // Revalidation, handled for you: a repeat read sends  // If-None-Match and a 304 costs nothing against the daily cap.  etagCache: new MemoryETagStore(),})
  • Setzen Sie ein Timeout. Der Standard ist großzügig, und eine Anfrage, die nie zurückkehrt, ist schlimmer als eine, die scheitert.
  • etagCache macht aus wiederholten Lesezugriffen bedingte Anfragen, und ein 304 zählt nicht gegen das Tageslimit.
  • Python liefert einen synchronen und einen asynchronen Client mit derselben Oberfläche, sodass ein FastAPI-Dienst und ein Cron-Skript eine Integration teilen.
  • Der Schlüssel gehört weiterhin auf einen Server. Kein SDK macht einen Browser sicher, was Schlüssel im Produktivbetrieb behandelt.

Beide SDKs laufen die Seiten für Sie durch und hören bei einer kurzen Seite auf, der Durchlauf verhält sich also gleich, ob ein Tarif eine Gesamtzahl meldet oder nicht. Handgeschriebene Schleifen gegen totalPages lesen auf Explorer genau eine Seite. Paginierung nennt die Grenzen je Tarif.

paging
TypeScript
The SDK walks the pages. It stops on a short page, so it works
1/2
// on every plan, including the ones that are not told the total.for await (const firearm of gunspec.firearms.listAutoPaging({ category: 'rifle', per_page: 100 })) {  await upsert(firearm)}

Jeder Fehlschlag ist eine Exception mit reason, status, details und requestId. Verzweigen Sie über den Grund, protokollieren Sie die Request-ID, und lassen Sie Fehler behandeln entscheiden, was eine Wiederholung lohnt.

errors
TypeScript
import { APIError, RateLimitError } from '@buun_group/gunspec-sdk' try {  return await gunspec.firearms.getAttachments(id)} catch (err) {  if (err instanceof RateLimitError) return retryLater(err)  if (err instanceof APIError) {    // Branch on reason, never on the message. Both are always    // present, and requestId is what support needs.    if (err.reason === 'PLAN_REQUIRED') return upsellFitment()    log.error({ reason: err.reason, requestId: err.requestId }, 'gunspec')  }  throw err}

Einige Antworten sind Bytes: das 3D-Modell, Bildderivate, die SVG-Zeichnungen. Sie kommen als Raw-Response mit Body, Content-Type und der URL, von der die Bytes nach einer CDN-Weiterleitung stammen. Das Bildmaterial rendern behandelt, welche Form Sie anfordern.

raw-bytes
TypeScript
// Some responses are files rather than JSON: the 3D model, an// image derivative, the bullet drawing. Those return raw bytes with// the content type and the final URL after any CDN redirect.const model = await gunspec.firearms.getModel('glock-g17')await writeFile('glock-g17.glb', model.body)console.log(model.contentType, model.body.byteLength)

Vier übliche Formen, mit einer gemeinsamen Regel: der Schlüssel bleibt auf der Serverseite Ihrer eigenen Grenze.

LaufzeitumgebungVerdrahtung
Next.js oder RemixClient auf Modulebene in einem Route-Handler oder einer Server-Action. Nie in eine Client-Komponente importieren.
FastAPI oder DjangoEin Client beim Start. Async für FastAPI, synchron für Django-Views und Management-Befehle.
Cloudflare Workers und andere Edge-LaufzeitenClient je Anfrage aus dem Binding-Secret bauen; Edge-Isolates leben kurz, halten Sie den ETag-Speicher also außerhalb.
Geplante Jobs und ImporterSynchroner Client, Auto-Paging, großzügiges Timeout und ein zwischen Läufen gespeicherter Cursor wie beim Spiegeln des Katalogs.