Spring til hovedindhold
Idempotency er en ny funktion, der kun er tilgængelig i det kommende API, som i øjeblikket er i beta. Den beskrevne adfærd kan ændre sig, indtil API’et frigives i General Availability.
Netværksfejl, timeouts og andre forbigående fejl kan efterlade dig i tvivl om, hvorvidt en request rent faktisk nåede frem til Smart Send. Idempotency lader dig gentage sådanne requests sikkert, uden risiko for at booke den samme forsendelse to gange eller skabe dublerede ressourcer.

Sådan fungerer idempotency

Idempotency er opt-in. For at aktivere det skal du inkludere en Idempotency-Key-header på en write-request:
Example
Når API’et modtager en nøgle, det ikke har set før, behandler det requesten normalt og gemmer responsen sammen med nøglen. Hvis du gentager med samme nøgle og samme payload inden for 24 timer, returnerer API’et den gemte respons i stedet for at udføre handlingen igen. Gentagelsen er derfor sikker: en forsendelse bookes kun én gang, selv hvis du sender requesten to gange. Requests, der sendes uden en Idempotency-Key-header, bliver ikke deduplikeret. Hver enkelt behandles uafhængigt.
Idempotency gælder for write-operationer (POST og DELETE). Læseoperationer (GET) er allerede sikre at gentage, så de ignorerer headeren. Når en gemt respons gentages, inkluderer API’et en Idempotency-Replayed: true-responseheader, så du kan skelne en gentagelse fra en nyligt udført request.

Sådan opretter du en idempotency-nøgle

Nøglen er en streng, der entydigt identificerer en enkelt logisk handling. Den skal opfylde disse krav: En tilfældig UUID v4 fungerer, men den tvinger dig til at generere nøglen på forhånd og gemme den sammen med ordren, så du kan genbruge præcis den samme værdi ved en gentagelse. En enklere tilgang er at udlede nøglen deterministisk fra data, du allerede har, f.eks. ordre-id’et kombineret med request-payloaden. Fordi de samme input altid giver den samme nøgle, genberegner en gentagelse den identiske nøgle, uden at du behøver at gemme noget:
Send den udledte værdi i Idempotency-Key-headeren. Hvis requesten fejler, og du gentager den, genberegner du nøglen ud fra den samme ordre og payload, og API’et genkender den som den samme handling.
At inkludere payloaden i nøglen betyder, at en anden payload giver en anden nøgle, som API’et behandler som en ny handling. Hvis du i stedet baserer nøglen på en stabil identifikator alene (f.eks. blot ordre-id’et), bliver genbrug med en ændret payload rapporteret som en konflikt — se nedenfor.

Sådan håndteres gentagne requests

Nøgler er afgrænset pr. klient og udløber automatisk 24 timer efter første brug. Derefter kan den samme nøgle bruges igen til en ny handling.
En request, der fejler validering, gemmes ikke sammen med nøglen. Du kan rette payloaden og prøve igen med den samme nøgle.

Konflikter og fejl

Hvis du modtager en 409 Conflict, er den oprindelige request stadig under behandling. Vent det antal sekunder, der er angivet i Retry-After-responseheaderen, og prøv derefter igen med den samme nøgle:
Example response
En 422 Unprocessable Entity betyder, at nøglen allerede er blevet brugt til en request med en anden payload. Genbrug enten den oprindelige payload, eller generér en ny nøgle til den nye handling.