結論
GASの「ウェブアプリケーションとして導入」を利用して、doPostの検証をcurlで行う時はリダイレクトが必要なら
$ curl -d "" -L <url>
のように指定する。
$ curl -X POST -d "" -L <url>
のように-Xオプションを指定すると405エラーになります。
-Xオプションのリダイレクト時の挙動が原因です。
その事については以下の記事にまとめましたのでぜひ御覧ください。
詳細
function doPost(e){
return ContentService.createTextOutput("Hello World");
}
上記のシンプルなHelloWorldコードをcurlを使ってテストします。
doPostのテストなので-Xオプションを使ってPOSTを指定します。
$ curl -X POST <end point url>
<HTML>
<HEAD>
<TITLE>Moved Temporarily</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Temporarily</H1>
The document has moved <A HREF="...">here</A>.
</BODY>
</HTML>
Moved Temporarilyと言われてしまいました。
レスポンスヘッダを確認してみます。
curl -i -X POST <end point url>
HTTP/2 302
...
302が返ってきました。
curlはデフォルトではリダイレクトに対応しないので、-Lオプションをつけてリダイレクトを処理します。
curl -X POST -L <end point url>
<!DOCTYPE html>
...
<title>Google ドライブ -- ページが見つかりません</title>
...
<p class="errorMessage" style="padding-top: 50px">現在、ファイルを 開くことができません。</p><p>アドレスを確認して、もう一度試してください。</p>
...
Google ドライブ?ファイルを開くことができません?
何言ってんだこいつ🤔
余談ですがすぐにレスポンスヘッダとか確認すればいいのにぼくはそれをせず、結果沼の奥底へ沈んでいきました。
推測するな、計測せよは本当に金言だと思います。(パフォーマンスチューニングの言葉らしいですが)
レスポンスヘッダを確認してみます。
$ curl -i -X POST -L <end point url>
HTTP/2 302
...
HTTP/2 405
...
allow: HEAD, GET
...
405が返ってきていました。
これはターゲットリソースがメソッドをサポートしていない事を表しています。
allowヘッダが示しているように、HEADとGETのみ許可されているらしいです。
-vオプションを付けると動作の詳細を確認出来るので見てみました。
$ curl -v -X POST -L <end point url>
...
> POST /macros/echo?user_content_key=... HTTP/2
...
この行だけだと伝わりづらいかもしれませんが、リダイレクト先のリソースに対してPOSTメソッドでリクエストを送っていました。上記の通り許可されているのはHEADとGETのみなのでこれが問題だったみたいです。
一般的にWebブラウザは302が返ってきたらGETメソッドに切り替えてリダイレクトします。
GASもその仕様に合わせてリダイレクト先ではGETメソッドを受け付けているという事なんだと思います。
curlの-Lオプションでリダイレクトを許可すると、多くのブラウザと同じようにリダイレクト時にPOSTをGETに切り替えます。
しかし-Xオプションは全てのリクエストに対して反映されるのでリダイレクト先にもPOSTリクエストを送ってしまいます。
このあたりは上記の私の記事にまとめましたのでぜひ御覧ください。
解決方法は既に結論で申し上げたとおり、-Xオプションを使いません。
-dオプションはPOSTのデータを指定するためのオプションですが、このオプションを指定した時点でPOSTメソッドが指定されるため-Xオプションを使う必要がありません。
送るデータがない場合は例のように空にすればOKです。
$ curl -d "" -L <end point url>
Hello World
やったぜ😂