Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
72
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@shirakiya

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
  ...
}
72
Help us understand the problem. What is going on with this article?
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
72
Help us understand the problem. What is going on with this article?