DRAEVADEVELOPERS
Entegrasyon rehberleri
DRAEVA / Public API

Node.js istemci rehberi

Aşağıdaki örnekler Node.js 20+ yerleşik fetch, FormData ve Blob API'lerini kullanır. API anahtarını yalnız server-side environment variable'dan okuyun.

Aşağıdaki örnekler Node.js 20+ yerleşik fetch, FormData ve Blob API'lerini kullanır. API anahtarını yalnız server-side environment variable'dan okuyun.

Ortak JSON çağrısı

ts
const BASE_URL = "https://api.getdraeva.com";
const key = process.env.DRAEVA_API_KEY;
if (!key) throw new Error("DRAEVA_API_KEY is missing");

async function draevaJson<T>(path: string, body: unknown): Promise<T> {
  const response = await fetch(`${BASE_URL}${path}`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${key}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
    signal: AbortSignal.timeout(30_000),
  });

  if (!response.ok) {
    const contentType = response.headers.get("content-type") ?? "";
    const problem = contentType.includes("application/problem+json")
      ? await response.json() as { type?: string }
      : null;
    const requestId = response.headers.get("x-request-id");
    throw new Error(
      `DRAEVA ${response.status} ${problem?.type ?? "unknown"} requestId=${requestId ?? "unknown"}`,
    );
  }

  return await response.json() as T;
}

Look Engine outfits

ts
const result = await draevaJson<{
  outfits: unknown[];
  warnings?: string[];
}>("/look/v1/outfits", {
  wardrobe: [
    {
      id: "top-1",
      category: "top",
      subcategory: "tshirt",
      layerRole: "base",
      cloValue: 0.08,
      primaryColor: { hex: "#1D3557" },
      occasionFitScores: { casual: 5 },
    },
  ],
  weather: { tempC: 22, condition: "clear" },
  occasions: ["casual"],
  maxResults: 3,
});

console.log(result.outfits.length);

Tam WardrobeItem alanları ve kategoriler için Look Engine ortak tipleri sayfasını kullanın. Tek parçalı gardırop gerçek koşullarda kombin üretmeye yetmeyebilir; örnek yalnız request yapısını gösterir.

Taxonomy multipart

ts
import { readFile } from "node:fs/promises";

const bytes = await readFile("garment.jpg");
const form = new FormData();
form.set("image", new Blob([bytes], { type: "image/jpeg" }), "garment.jpg");
form.set("qc", "photo");

const response = await fetch(`${BASE_URL}/taxonomy/v1/taxonomy`, {
  method: "POST",
  headers: { Authorization: `Bearer ${key}` },
  body: form,
  signal: AbortSignal.timeout(60_000),
});

if (!response.ok) {
  throw new Error(
    `Taxonomy failed: ${response.status}; requestId=${response.headers.get("x-request-id") ?? "unknown"}`,
  );
}

const taxonomy = await response.json() as { broken?: boolean };
if (taxonomy.broken === true) {
  // Ask the user for a better garment image.
}

FormData gönderirken Content-Type header'ını elle yazmayın; boundary değerini runtime üretir.

Retry sınırı

POST çağrılarını otomatik tekrar denemeden önce işlemin ve kotanın etkisini değerlendirin. Yalnız 429, 502 ve 503 için sınırlı retry uygulayın; 429 durumunda Retry-After değerine uyun. 400, 401, 403, 413 ve 415 request veya yapılandırma düzeltilmeden tekrar denenmemelidir.

Bu sayfada

Bir sorunuz mu var?API erişimi ve destek →