[Design Pattern] Encapsulate a network request lib - 3. Request Idempotency
Idempotency is a mathematical concept often abstracted as:
f(n) = 1n
, no matter what's the value of n
, f(n)
alwayhs equals 1
In network requests, many interfaces require idempotency. For example, multiple payments for the same order or the impact of one payment on the user's balance should have the same outcome.
To address this issue, we must ensure that repeated requests are not processed again.
The key issue here lies in defining what constitutes a "repeated request."?
We can redefine repetition as: The request method, request headers, and request body are entirely consistent.
Therefore, we can use a hash to encode the request into a single string.
function hashRequest(req) {
const spark = new SparkMD5();
spark.append(req.url);
for (const [key, value] of Object.entries(req.headers)) {
spark.append(key);
spark.append(value);
}
spark.append(req.body);
return spark.end();
}
We can directly returnt the cache result when the request is idempoten.
function createIdmpotentRequestor(genKey) {
return crateCacheRequestor({
key: (config) => genKey ? genKey(config) :hashRequest(config),
persist: false
});
}