初歩からの無職

GASへのPOSTリクエストの返り値の受け取り方

  • JavaScript
  • Node.js
  • Google Apps Script

Google Apps ScriptはGETリクエスト、POSTリクエストを受け取るとそれぞれdoGet(), doPost()が走ります。このときHtmlServiceContentServiceなどのObjectでレスポンスを返すことができます。

いつもリクエスト投げっぱなしだったのですが、ちゃんとレスポンスを返すようにした方がWebAppっぽいので以下のような感じで試しにjsonを返すことにしました。

return ContentService.createTextOutput(res).setMimeType(ContentService.MimeType.JSON);

試しに送ってみると何やらエラーを吐いているので調べてみると、どうも"Moved Temporarily"というHTMLが返ってきていて、302リダイレクトが返されているらしい。

ググるとGASは常にそういう振る舞いらしいのでドキュメントを見てみます。

For security reasons, content returned by the Content service isn't served from script.google.com, but instead redirected to a one-time URL at script.googleusercontent.com. This means that if you use the Content service to return data to another application, you must ensure that the HTTP client is configured to follow redirects. For example, in the cURL command line utility, add the flag -L. Check the documentation for your HTTP client for more information on how to enable this behavior. Content Service | Apps Script | Google Developers

セキュリティ上の理由でワンタイムURLにリダイレクトさせてるので使ってるHTTP clientでリダイレクトをfollowしてねとのこと。

Node.jsのrequestモジュールだとfollowRedirectはデフォルトでtrueだったがfollowAllRedirectsのほうにnon-GET HTTP 3xx responsesとあるのでPOSTリクエストの場合はこっちっぽい。リダイレクトを有効にしたところ、正常に値を受け取ることができました。

参考:GASにPOSTする時はリダイレクトのサポートをオンにするのを忘れるな - Qiita