Idempotentlik
Tarmoq uzilsa, so'rov bajarilgan-bajarilmaganini bilmay qolasiz. Idempotency-Key qayta yuborishni xavfsiz qiladi: kredit ikki marta yechilmaydi va ikkita hujjat yaratilmaydi.
Qanday ishlaydi
POST /v1/orders va POST /v1/credits/purchases so'rovlariga o'zingiz yaratgan noyob kalitni yuboring:
Idempotency-Key: 1001-v1
- Birinchi so'rov odatdagidek bajariladi.
- Xuddi shu kalit va xuddi shu tana bilan qayta yuborsangiz, birinchi javobning o'zi qaytadi (yangi buyurtma yaratilmaydi).
- Xuddi shu kalit, lekin boshqa tana yuborsangiz,
409 idempotency_conflictqaytadi. - Kalitlar 24 soat saqlanadi.
Kalit tanlash
- UUID v4 yaxshi tanlov. Yoki o'z buyurtma raqamingiz asosida:
order-1001-v1. - Uzunligi 255 belgigacha.
- Foydalanuvchi buyurtmani haqiqatan yangidan bermoqchi bo'lsa, yangi kalit ishlating.
import uuid, requests
key = str(uuid.uuid4()) # buyurtma bilan birga saqlab qo'ying
def create_order(payload):
for attempt in range(5):
try:
r = requests.post(
"https://api.osontopshir.uz/partner/v1/orders",
headers={**H, "Idempotency-Key": key},
json=payload, timeout=30,
)
if r.status_code < 500 and r.status_code != 429:
return r.json()
except requests.RequestException:
pass
time.sleep(2 ** attempt)
raise RuntimeError("Buyurtma yuborilmadi")
import { randomUUID } from "node:crypto";
const key = randomUUID(); // buyurtma bilan birga saqlab qo'ying
async function createOrder(payload) {
for (let attempt = 0; attempt < 5; attempt++) {
try {
const r = await fetch("https://api.osontopshir.uz/partner/v1/orders", {
method: "POST",
headers: { ...H, "Idempotency-Key": key, "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
if (r.status < 500 && r.status !== 429) return await r.json();
} catch (e) {}
await new Promise((res) => setTimeout(res, 2 ** attempt * 1000));
}
throw new Error("Buyurtma yuborilmadi");
}