【入門編】 HTTPメソッドPOSTの非冪等性 – Web APIアーキテクチャ・データ連携実践ガイド

郵便局の「窓口」と「ポスト」の違い:HTTPのPOSTメソッドが「非冪等」である理由

皆さん、こんにちは。ネットワークの深淵を覗き込み、パケットの鼓動を愛してやまないインフラアーキテクトです。

Web APIの開発において、避けては通れないのが「REST APIの設計」ですよね。特に「メソッド」の使い分けは、APIの美しさを決める重要なポイントです。その中でも、新人エンジニアが最初に躓きやすいのが、POSTメソッドの持つ「非冪等(ひべきとう)性」という概念です。

今回は、この少し難しそうな言葉を、私たちの身近にある「郵便」の仕組みに例えて紐解いていきましょう。

—

そもそも「冪等(べきとう)」って何?

数学用語のような響きですが、ITの世界では「何度同じ操作をしても、結果が同じになること」を指します。

例えば、テレビのリモコンで「電源ボタン」を押す操作を考えてみてください。
一度押せば電源が入り、もう一度押せば切れる……これは「冪等ではない」操作です。でも、「音量を上げるボタン」はどうでしょう? 10回押せば、音量は10段階上がりますよね。

APIの世界でも、この「何度やっても同じ結果になるか?」という性質が、エラー処理や再試行(リトライ)を設計する上で非常に重要になってくるのです。

—

POSTは「郵便局の窓口」、GETは「私書箱の確認」

POSTメソッドは、リソース(データ)を「新規作成」する時に使います。これを郵便に例えると、「窓口で書留を出す」行為に近いです。

あなたが郵便局の窓口へ行き、「この手紙を速達で送ってください!」と頼むとします。
もし、窓口の人が通信トラブルで「すみません、もう一度お願いします」と言ったとき、あなたは同じ手紙をもう一度差し出しますよね。するとどうなるか? 相手には「同じ内容の手紙が2通」届いてしまいます。

これが POST の「非冪等性」です。
「同じ操作を繰り返すと、新しいデータがその分だけ増えてしまう」という特性を持っているんですね。

一方で、GET(データの取得)は、自分の私書箱を確認するようなものです。1回覗いても100回覗いても、中身が変わらない限り、郵便物は増えませんよね。これが「冪等」な操作です。

—

なぜ「非冪等」だと困ることがあるの?

ネットワークの世界は、実はとても不安定です。パケットが途中で迷子になったり、サーバーからの応答がタイムアウトしたりすることは日常茶飯事です。

もし、あなたが「注文ボタン」を押したときに、サーバーからの「受付完了!」という返事を受け取れなかったらどうしますか? 不安になって「もう一度ボタンを押す」はずです。

もしこれが POST の設計を無視して、「何度押しても1つの注文しか入らないように」工夫していなかったら、「同じ商品を2つ注文してしまった!」という悲劇が起こります。

—

実務での対策:重複を防ぐには?

「じゃあ、POSTは危なくて使えないの?」というと、そんなことはありません。現場では「冪等キー(Idempotency Key)」という仕組みを使って、この問題を解決するのが一般的です。

例えば、クライアント側で「このリクエストは一意ですよ」という番号をヘッダーに含めて送る方法です。

# Pythonでのリクエスト送信イメージ

import requests

# クライアント側で生成した一意なID(UUIDなど)
# これをヘッダーに含めることで、サーバー側で重複を検知します
headers = {
    "Idempotency-Key": "550e8400-e29b-41d4-a716-446655440000",
    "Content-Type": "application/json"
}

data = {
    "item_id": 123,
    "quantity": 1
}

# POSTメソッドで注文を送信
# サーバー側では、このキーが既に処理済みかを確認します
response = requests.post("https://api.example.com/orders", json=data, headers=headers)

サーバー側では、この Idempotency-Key をデータベースに記録しておき、「同じキーが来たら、2回目は新規作成せず、前回の結果を返す」という処理を実装します。これが、プロの現場で行われている「安全な設計」です。

—

まとめ:一歩ずつ理解していきましょう!

POSTメソッドが「非冪等である」ということは、「新しいものを作る力がある分、扱いには注意が必要」というサインだと覚えておいてください。

1. POSTは新規作成!(毎回新しいリソースができる)
2. ネットワークは失敗するもの!(リトライが起きても大丈夫な設計を)
3. 冪等キーで安全を守る!(識別子を使って重複を制御する)

これらを意識するだけで、あなたの作るAPIは、まるで熟練の職人が書いたような、堅牢で美しいものに変わります。

最初は難しく感じるかもしれませんが、まずは「この操作を2回繰り返したら、データはどうなるかな?」と想像する癖をつけてみてください。その視点こそが、優秀なインフラ・バックエンドエンジニアへの第一歩です。

それでは、また次回の深淵でお会いしましょう!

コメント

タイトルとURLをコピーしました