GET
PUT
DELETE
OPTIONS
curl -X OPTIONS http://localhost:3000/resource -i
node.js로 구축한 간단한 option 서버
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
app.options("/resource", (req, res) => {
res
.set({
Allow: "GET, HEAD, OPTIONS",
"Access-Control-Allow-Methods": "GET, HEAD, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
"Access-Control-Allow-Origin": "*",
})
.end();
});
app.get("/resource", (req, res) => {
res.status(200).json({ ka: 1 });
});
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
POST
멱등성을 가지지 않음
, 동일한 POST 요청을 여러 번 보내면 서버에 여러 리소스가 생성될 수 있음PATCH
POST/payments
Idempotency-Key: 6fa5438a-6818-48d9-bb15-6954a1f3e3a3
node.js를 이용한 서버 구축 예시
const express = require("express");
const app = express();
app.use(express.json());
const idempotencyKeyStore = {};
app.post("/order", (req, res) => {
const idempotencyKey = req.headers["idempotency-key"];
if (!idempotencyKey) {
return res.status(400).json({ error: "멱등성에 관한 키가 필요합니다." });
}
if (idempotencyKeyStore[idempotencyKey]) {
return res.status(200).json({
message: "동일한 요청을 받았습니다.",
result: idempotencyKeyStore[idempotencyKey],
});
}
const order = {
id: Math.floor(Math.random() * 1000000),
items: req.body.items,
total: req.body.total,
};
idempotencyKeyStore[idempotencyKey] = order;
res.status(201).json(order);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
curl 요청
curl -X POST http://localhost:3000/order \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6fa5438a-6818-48d9-bb15-6954a1f3e3a3" \
-d '{"items": ["apple", "banana"], "total": 15}'
일관성 : 반복되는 요청이 단일 요청과 동일한 효과를 갖도록 보장하는 것은 시스템 전반에 걸쳐 일관된 상태를 유지하는 데 도움이 됨
유지보수성 : 멱등성을 가진 HTTP API로 통신하는 부분에 있어서는 재시도를 처리할 때의 사이드이펙트를 고려한 복잡한 로직을 구현할 필요가 없기 때문에 이 부분을 잘 설계한다면 유지보수성이 증가됨