curlでリダイレクトを追従する正しい方法
2025年11月13日
はじめに
GASのようにリダイレクト(302)を返すAPIをテストする際、curlコマンドの使い方を間違えると、 POSTメソッドがGETに変わってしまったり、リクエストボディが失われたりする問題が発生します。
この記事では、実際に遭遇した問題と、正しい解決方法を詳しく解説します。
問題:POSTがGETに変わる
以下のようなコマンドを実行すると、一見正しそうに見えますが問題があります:
# ❌ 間違った例
curl -X POST -L \
-H "Content-Type: application/json" \
-d '{"key": "value"}' \
"https://script.google.com/macros/s/.../exec"-L(リダイレクト追従)と-X POSTを同時に使うと、 リダイレクト先でもPOSTメソッドを強制しようとしますが、 一部のケースでHTTPの仕様に従ってGETに変換されてしまいます。
解決方法
正しい方法は、-X POSTを付けずに、-d だけを指定することです:
# ✅ 正しい例
curl -L \
-H "Content-Type: application/json" \
-d '{"key": "value"}' \
"https://script.google.com/macros/s/.../exec"なぜこれで動くのか?
curlは-dオプションが指定されると、自動的にPOSTメソッドを使用します。
-X POSTを明示的に指定すると、リダイレクト後も強制的にPOSTを使おうとして 問題が発生しますが、-dだけの場合はHTTPの仕様に従って適切に処理されます。
実践例:LINE Webhookのテスト
LINE Messaging APIのWebhook形式でGASをテストする場合:
curl -L \
-H "Content-Type: application/json" \
-d '{
"events": [
{
"type": "message",
"replyToken": "dummyReplyToken",
"source": {
"userId": "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"type": "user"
},
"timestamp": 1731465600000,
"message": {
"id": "1234567890",
"type": "text",
"text": "テストメッセージ"
}
}
]
}' \
"https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec"curlオプションまとめ
| オプション | 説明 |
|---|---|
-L | リダイレクトを追従する |
-d | POSTデータを送信(自動的にPOSTメソッドになる) |
-H | HTTPヘッダーを指定 |
-X POST | メソッドを明示的に指定 ⚠️ -L との併用は避ける |
-v | 詳細なログを表示(デバッグ用) |
デバッグのコツ
リダイレクトの挙動を確認したい場合は、-v(verbose)オプションを追加します:
curl -v -L \
-H "Content-Type: application/json" \
-d '{"key": "value"}' \
"https://script.google.com/macros/s/.../exec"これにより、以下の情報が表示されます:
- リダイレクトのステータスコード(302)
- リダイレクト先のURL
- 各リクエストのメソッド
- 送受信したヘッダー
しかし、本番環境では...
curlではリダイレクトに対応できても、LINE Webhookなどのシステムはリダイレクトをサポートしていません。
そのため、本番環境ではWebhook Proxy Serviceのような中継サービスが必要になります。
Webhook Proxy Serviceの利点
- リダイレクトを自動的に処理
- 常に200ステータスを返すため、Webhookシステムと互換性が高い
- あらゆるHTTPメソッドに対応
- セットアップが簡単(API Keyを取得するだけ)
まとめ
-X POSTと-Lの同時使用は避ける- POSTデータを送る場合は
-dだけで十分 - デバッグには
-vオプションが便利 - 本番のWebhookにはリダイレクト対応の中継サービスを使う