What if clicking twice could cost you twice the money? Idempotency keys stop that from happening!
Why Idempotency keys for safe retries in Rest API? - Purpose & Use Cases
Imagine you are ordering a pizza online. You click the "Order" button, but the internet is slow, so you click it again just to be sure. Now, the pizza place might receive two orders instead of one.
Without a way to tell if the order is a repeat, the system might charge you twice and send two pizzas. Fixing this after the fact is confusing and frustrating for both you and the pizza place.
Idempotency keys act like a unique ticket for each order. When the system sees the same ticket again, it knows not to repeat the action, preventing duplicate charges or orders.
POST /order {"item": "pizza"}
// User clicks twice, two orders createdPOST /order {"item": "pizza"} with header Idempotency-Key: abc123
// Second request with same key ignoredThis lets users safely retry actions without fear of causing duplicates or errors, making apps more reliable and user-friendly.
When booking a flight ticket online, if your payment request times out, you can retry without accidentally buying two tickets because the system recognizes your unique idempotency key.
Manual retries can cause duplicate actions and errors.
Idempotency keys uniquely identify requests to prevent repeats.
This makes retrying safe and improves user trust.
Practice
idempotency key in REST APIs?Solution
Step 1: Understand idempotency key concept
An idempotency key is a unique identifier sent with a request to ensure the server processes it only once.Step 2: Identify the main purpose
This prevents duplicate actions like double payments or repeated orders if the client retries the request.Final Answer:
To prevent duplicate processing of the same request -> Option BQuick Check:
Idempotency key = prevent duplicates [OK]
- Confusing idempotency key with authentication token
- Thinking it speeds up response time
- Assuming it encrypts data
Solution
Step 1: Recall standard header for idempotency
The standard practice is to send the unique idempotency key in theIdempotency-KeyHTTP header.Step 2: Differentiate from other headers
Authorizationis for credentials,Content-Typedefines data format, andCache-Controlmanages caching.Final Answer:
Idempotency-Key -> Option AQuick Check:
Idempotency key header = Idempotency-Key [OK]
- Using Authorization header for idempotency key
- Confusing Content-Type with idempotency key
- Sending key in request body instead of header
stored_keys = {}
def handle_request(idempotency_key, data):
if idempotency_key in stored_keys:
return stored_keys[idempotency_key]
response = process_data(data)
stored_keys[idempotency_key] = response
return response
# Client sends:
print(handle_request('abc123', 'order1'))
print(handle_request('abc123', 'order1'))
print(handle_request('xyz789', 'order2'))
What will be the output?Solution
Step 1: Analyze first call with key 'abc123'
Key not in stored_keys, so process_data('order1') runs, result saved and returned.Step 2: Analyze second call with same key 'abc123'
Key found, stored response returned without reprocessing.Step 3: Analyze third call with new key 'xyz789'
Key not found, process_data('order2') runs, result saved and returned.Final Answer:
process_data output for order1, process_data output for order1, process_data output for order2 -> Option DQuick Check:
Repeated key returns cached response [OK]
- Assuming second call reprocesses data
- Confusing keys and responses
- Thinking None is returned on repeats
cache = {}
def post_request(key, data):
if key not in cache:
process(data)
return cache[key]
What is the bug in this code?Solution
Step 1: Check caching logic
The code checks if key not in cache, then calls process(data), but never saves the result in cache.Step 2: Identify consequence
Since cache[key] is never set, returning cache[key] will cause a KeyError or return None incorrectly.Final Answer:
It never stores the processed result in cache -> Option AQuick Check:
Missing cache storage causes errors [OK]
- Assuming process(data) stores result automatically
- Ignoring missing cache assignment
- Thinking HTTP method affects caching here
Solution
Step 1: Understand safe retry requirements
Safe retries mean the client can resend the same request without causing duplicate charges.Step 2: Evaluate options
Store the payment result linked to the idempotency key and return it on repeated requests stores the payment result linked to the key and returns it on repeats, preventing double charges. Ignore the idempotency key and process every request independently processes every request, risking duplicates. Reject any request with an idempotency key that was seen before rejects repeats, which may cause client errors. Process the payment again but log a warning for duplicate keys processes again, causing duplicates.Final Answer:
Store the payment result linked to the idempotency key and return it on repeated requests -> Option CQuick Check:
Store and reuse result for idempotency [OK]
- Rejecting repeated keys causing client errors
- Processing duplicates causing double charges
- Logging warnings but still charging twice
Ready to prove it?
Pass the test and this pattern moves unknown
