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

EndapunkturIdempotency-Key
POST/v1/tradesSkylda
POST/v1/giftcardsSkylda
POST/v1/quotesValfrjá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-Key og meginmálið haldast óbreytt.
  • Eftir 502, 504 eða rofna tengingu skaltu reyna aftur með sama lykli þar til þú færð skýrt svar. 504 gateway_timeout á POST beið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)