POSTリクエストは、リダイレクトさせるとGETに化ける!

「POSTがGETに化けた!」——某買い切りパッケージAPI連携でハマった話と対処法

症状
とある買い切りパッケージのAPIに、POSTでデータを送っているのに、サーバ側ではGET扱いになっていてパラメータが全く届かない
しかもエラーも出ず、ログを見ても「空っぽ」。
「え?なんで?」と半日ハマりました。

結論から言うと、リダイレクトが原因でした。
HTTPの世界では、301/302/303/307などのステータスでリダイレクトが発生したとき、
一部のクライアントはPOSTをGETに変えて再リクエストすることがあります。

何が起きていたのか(実話)

1) クライアント: /api/registerPOST

POST /api/register HTTP/1.1 Content-Type: application/x-www-form-urlencoded userid=test01&email=test@example.com

2) サーバ(パッケージ製品のフロント設定)

  • 内部で「末尾スラッシュがないURLはリダイレクト」設定がされており、
    /api/register/api/register/301 Moved Permanently を返す。

3) クライアント:自動でリダイレクト先へアクセス

  • ここでメソッドがPOST→GETに変化

  • 結果、サーバ側ではこう見える:

GET /api/register/ HTTP/1.1

本文もパラメータも全部消えた。

つまり、「パラメータが届かない」のではなく、POSTがGETにすり替わって再送されていたというわけです。

原因の本質

リダイレクト時の挙動はブラウザやHTTPクライアントごとに微妙に異なり、
301/302では多くの実装が「GETに変える」仕様になっています。
(歴史的な互換のためらしいです)

APIのようにPOSTが前提のエンドポイントでこれが起こると、
「何も届かない」「想定外のメソッド」といった問題につながります。

要は、最後は「/」終わりが無難で気をつけましょうということでした!


0 件のコメント :

コメントを投稿