Help us understand the problem. What is going on with this article?

GASのdoPost関数をcurlでテストする時リダイレクトが必要なら-Xオプションを使わない

More than 1 year has passed since last update.

結論

GASの「ウェブアプリケーションとして導入」を利用して、doPostの検証をcurlで行う時はリダイレクトが必要なら

$ curl -d "" -L <url>

のように指定する。

$ curl -X POST -d "" -L <url>

のように-Xオプションを指定すると405エラーになります。
-Xオプションのリダイレクト時の挙動が原因です。
その事については以下の記事にまとめましたのでぜひ御覧ください。

curlで送ったPOSTリクエストがリダイレクトされる時-XPOSTを使うか否かで挙動が変わる (https://qiita.com/nkitgamesake/items/3907a677e09ad1a5b57b)

詳細

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

やったぜ😂

cajonito
アラサーITエンジニアです。自社サービス会社の立ち上げから初期投資回収までシステム全般の責任者として携わりました。 フロントエンドデザイン以外の全ての工程を担当。現在はLaravelを中心にバックエンドエンジニアスキルを勉強中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away