93
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Google Apps ScriptのdoPostでJSONなパラメータのPOSTリクエストを受ける

Google Apps Script(GAS)は HTTPSリクエストを受け取り処理を行うというサーバレスなAPIサーバを導入することができる。(参考: Web Apps  |  Apps Script  |  Google Developers
それを使って、JSONフォーマットで記述されたリクエストパラメータでPOSTリクエストを送り、何かしらやろうとしたところ少しハマった。

JSONパラメータを受けparseする

例えばこんなリクエストを送った場合を想定。リクエストパラメータをJSONフォーマットで記述されている。

curl -X POST -H "Content-Type: application/json" -d '{"value": "AAA"}' <GASウェブアプリケーションのURL>

このような時は以下のように書くことでリクエストパラメータをオブジェクトで受けることができる。

function doPost(e) {
  var params = JSON.parse(e.postData.getDataAsString());  // ※
  var value = params.value;  // => "AAA"が取れる

  // 何らかの処理...

  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify({ message: "success!" }));

  return output;
}

少し解説すると、コード内 を付けているところが今回のキモ。
Content-Type: application/json を付けているものの、GAS的にはそれを見ていない(?)ようで e.postDataFileUploadクラスになっており、これはblobクラスを継承したクラス。
なので、.getDataAsString()メソッドでJSON文字列を得ることができ、それをJSON.parseすることでJavaScriptのオブジェクトに変換している、ということを行っている。

ちなみに

以下のように e.parameter を使うと何も取れないので注意。おそらくこの parameter は"クエリパラメータ"のことだと思われる。

function doPost(e) {
  var value = e.parameter.value;

  console.log(e.parameter);  // => 空オブジェクト( {} )
  console.log(value);        // => undefined
  ...
}

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
93
Help us understand the problem. What are the problem?