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.postData
は FileUploadクラスになっており、これは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
...
}