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ı
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
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
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.