Hugtök
Örugg endurtekning
Idempotency-Key gerir það öruggt að reyna POST beiðni aftur: ef fyrri tilraunin fór í gegn skilar endurtekning með sama lykli niðurstöðu hennar í stað þess að eiga viðskiptin tvisvar.
Af hverju þetta skiptir máli
Net bregðast á versta tíma. Ef POST /v1/trades rennur út á tíma geturðu ekki vitað hvort viðskiptin urðu. Að reyna aftur án varnar gæti keypt tvisvar; að reyna ekki aftur gæti misst af viðskiptunum. Með Idempotency-Key er óhætt að reyna aftur, hvort sem er.
Hausinn
| Endapunktur | Idempotency-Key |
|---|---|
POST/v1/trades | Skylda |
POST/v1/giftcards | Skylda |
POST/v1/quotes | Valfrjálst |
Lykill er 1 til 64 stafir úr A-Z, a-z, 0-9, _ og -. UUID v4 hentar vel.
Hvernig þetta virkar
Myntkaup geymir hvern lykil í 24 klukkustundir, fyrir hvern aðgang:
- Sami lykill, sama meginmál: geymda staðan og svarið eru send aftur. Ekkert er framkvæmt tvisvar.
- Sami lykill, annað meginmál:
409 idempotency_conflict. Notaðu nýjan lykil fyrir nýja beiðni. - Sami lykill meðan fyrri beiðnin er enn í vinnslu:
409 idempotency_in_progress. Bíddu aðeins og reyndu aftur með sama lykli.
Góð notkun
- Búðu til einn lykil fyrir hverja aðgerð, ekki fyrir hverja tilraun. Hver endurtekning þeirrar aðgerðar notar hann aftur, með sama meginmáli.
- Vistaðu lykilinn áður en þú sendir beiðnina, ásamt því sem þú ætlaðir að gera. Ef forritið þitt hrynur og fer aftur í gang getur það reynt aftur með vistaða lyklinum í stað þess að byrja upp á nýtt.
- Undirritaðu hverja tilraun upp á nýtt. Hver tilraun þarf nýjan tímastimpil og nýtt nonce; aðeins
Idempotency-Keyog meginmálið haldast óbreytt. - Eftir
502,504eða rofna tengingu skaltu reyna aftur með sama lykli þar til þú færð skýrt svar.504 gateway_timeoutáPOSTbeiðni þýðir að hún gæti enn klárast.
# Signed by sign-headers.sh: see Authentication
body='{"quote_id":"qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W"}'
idempotency_key=$(uuidgen) # reuse it to retry safely
curl https://public-api.myntkaup.is/v1/trades \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $idempotency_key" \
$(./sign-headers.sh POST /v1/trades "$body" | sed 's/^/-H /') \
--data "$body"import { Myntkaup } from "@myntkaup/api";
const client = new Myntkaup(); // reads the key from the environment
// Sends a random Idempotency-Key unless you pass idempotencyKey.
const trade = await client.trades.create({ quoteId: "qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W" });
console.log(trade.status, trade.base_amount);from myntkaup import Myntkaup
client = Myntkaup() # reads the key from the environment
# Sends a random Idempotency-Key unless you pass idempotency_key.
trade = client.trades.create(quote_id="qt_01JB8X2Q4M7Z3V9K5T1N6R0P2W")
print(trade["status"], trade["base_amount"])Í SDK-unum
trades.create og giftcards.create senda slembið UUID v4 ef þú gefur ekki upp lykil, og sjálfvirkar endurtekningar þeirra nota það aftur. quotes.create sendir aðeins lykil ef þú gefur hann upp. Til að þola það að þitt eigið forrit hrynji skaltu senda lykil sem þú hefur vistað:
import { randomUUID } from "node:crypto";
const idempotencyKey = randomUUID();
await saveIntent({ quoteId: quote.id, idempotencyKey }); // your own storage
const trade = await client.trades.create({ quoteId: quote.id, idempotencyKey });import uuid
idempotency_key = str(uuid.uuid4())
save_intent(quote_id=quote["id"], idempotency_key=idempotency_key) # your own storage
trade = client.trades.create(quote_id=quote["id"], idempotency_key=idempotency_key)