「POSTがGETに化けた!」——某買い切りパッケージAPI連携でハマった話と対処法
症状
とある買い切りパッケージのAPIに、POSTでデータを送っているのに、サーバ側ではGET扱いになっていてパラメータが全く届かない。
しかもエラーも出ず、ログを見ても「空っぽ」。
「え?なんで?」と半日ハマりました。
結論から言うと、リダイレクトが原因でした。
HTTPの世界では、301/302/303/307などのステータスでリダイレクトが発生したとき、
一部のクライアントはPOSTをGETに変えて再リクエストすることがあります。
何が起きていたのか(実話)
1) クライアント: /api/register
に POST
2) サーバ(パッケージ製品のフロント設定)
-
内部で「末尾スラッシュがないURLはリダイレクト」設定がされており、
/api/register
→/api/register/
に 301 Moved Permanently を返す。
3) クライアント:自動でリダイレクト先へアクセス
-
ここでメソッドがPOST→GETに変化。
-
結果、サーバ側ではこう見える:
本文もパラメータも全部消えた。
つまり、「パラメータが届かない」のではなく、POSTがGETにすり替わって再送されていたというわけです。
原因の本質
リダイレクト時の挙動はブラウザやHTTPクライアントごとに微妙に異なり、
301/302では多くの実装が「GETに変える」仕様になっています。
(歴史的な互換のためらしいです)
APIのようにPOSTが前提のエンドポイントでこれが起こると、
「何も届かない」「想定外のメソッド」といった問題につながります。
要は、最後は「/」終わりが無難で気をつけましょうということでした!
0 件のコメント :
コメントを投稿