[ノンプロ研]GAS中級講座6期Day6 HTTP通信・API

GAS

どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年9月から始まりました「ノンプロ研GAS中級講座6期」について、全7回でお届けします。今日はDay6です。

前回のおさらい

前回は、「Utilitiy services2」 をお届けしました。

今回は、 いよいよ最終回で 「HTTP通信・API」 をお届けします。

今日のアジェンダ

  1. HTTP通信とUrl Fetchサービス
  2. GETリクエスト
  3. POSTリクエストとJSON

GAS中級5期でも補講ブログを書いていますので、こちらも参考にしてください。

HTTP通信とUrl Fetchサービス

公式リファレンス

公式リファレンスで、UrlFetchAppクラスの場所を確認しておきましょう。

Utility servicesに所属する、API & database connectionsに入っているようです。

BigQueryとか、JDBC(Java Database Connectivity)も、気になるところですね。いつか触ってみましょう。 

fetchAll()メソッド

UrlFetchAppクラスには、fetchAll()メソッドが提供されています。

これは、fetch()メソッドが、単体のHTTPリクエストに対し、複数のHTTPリクエストを実行するものです。  出典:『GAS中級講座卒業したいLT』noriさん

「複数の」という意味は、「配列で複数のHTTPリクエストを引数に渡す」という意味です。

まずは、復習です。講座でも紹介した、https://httpbin.orgを利用して、単体のHTTPリクエストを送信してみましょう。

function myFunctionHoko06_01() {

  const url = 'https://httpbin.org/post';
  const params = {
    method: 'post',
    payload: { custname: 'Bob', custtel: '0900000', comments: 'よろしく!' }
  };

  const response = UrlFetchApp.fetch(url, params);
  const text = response.getContentText();
  console.log(text)

  /*
{
  "args": {}, 
    ~中略~
  "form": {
    "comments": "\u3088\u308d\u3057\u304f\uff01", 
    "custname": "Bob", 
    "custtel": "0900000"
  },  
  ~中略~
  "url": "https://httpbin.org/post"
}
  */

  const obj = JSON.parse(text);
  const formData = obj.form;

  console.log(formData.custname); //Bob
  console.log(formData.custtel); //0900000
  console.log(formData.comments); //よろしく

}

それでは、複数のHTTPリクエストを送信してみましょう。

このように、fetchAllの引数に、HTTPリクエストのパラメータを配列で渡します。

今まで、引数はfetch(url,param)という形で書いていましたが、このようにプロパティさえ指定できていれば、1つのオブジェクトにできます。

function myFunctionHoko06_02() {

  const request1 = {
    'url': 'https://httpbin.org/post',
    'method': 'post',
    'payload': { custname: 'Bob', custtel: '0900000', comments: 'Bobだよ!' }
  };

  const request2 = {
    'url': 'https://httpbin.org/post',
    'method': 'post',
    'payload': { custname: 'Tom', custtel: '0800000', comments: 'おれはTomだ!' }
  };

  const responses = UrlFetchApp.fetchAll([request1, request2]); //[{},{}]

  for (const response of responses) {

    const text = response.getContentText();

    const obj = JSON.parse(text);
    const formData = obj.form;

    console.log(formData.custname);
    console.log(formData.custtel);
    console.log(formData.comments);
    console.log(); //ログを見やすくするため

  }

}

中級ブートキャンプにご参加いただいたみなさんなら、最後のfor文は、map()メソッドで退治できますよね。

解答を見る前に、ぜひチャレンジしてみてください。

  //for文を使わずにmap()で書く
  const responseArray = responses.map(response => {

    const text = response.getContentText();

    const obj = JSON.parse(text);
    const formData = obj.form;

    return [formData.custname, formData.custtel, formData.comments];
  });

  console.log(responseArray);

GETリクエスト

クエリ文字列をfetch()メソッドの引数で渡す

クエリ文字列は、GETリクエストのURLで送信されます。

ほとんどのばあい、リクエストURLにクエリ文字列をパラメーターとして記述します。

const url = 'https://tonari-it.com/?s=python';
const response = UrlFetchApp.fetch(url);

あまりこのような書き方はしないと思いますが、fetchメソッドの第二引数を使ってリクエストを送信するさいは、bodyプロパティ として渡します。

const url = 'https://tonari-it.com';
const params = {body : JSON.stringify({s: 'python'})}
const response = UrlFetchApp.fetch(url, params);

JSON.parse()メソッドとレスポンスオブジェクト

fetch()メソッドの戻り値は、HTTPResponseオブジェクトです。

サーバーにたいして、HTTPリクエストを送信すると、HTTPResponseオブジェクトを取得します。

この、HTTPResponseオブジェクトには、getContentText()メソッドが提供されており、中身を文字列化できます。

郵便番号APIは、レスポンスでJSONを返しますので、その中身を見てみましょう。

  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060';
  const response = UrlFetchApp.fetch(url);
  const text = response.getContentText();
  console.log(text);

  /*
{
  "message": null,
  "results": [
    {
      "address1": "高知県",
      "address2": "南国市",
      "address3": "蛍が丘",
      "kana1": "コウチケン",
      "kana2": "ナンコクシ",
      "kana3": "ホタルガオカ",
      "prefcode": "39",
      "zipcode": "7830060"
    }
  ],
  "status": 200
}
  */

この文字列は、JSON文字列です。

なので、JSONオブジェクトに変換すると、各プロパティにアクセスできるようになります。

  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060';
  const response = UrlFetchApp.fetch(url);
  const text = response.getContentText();

  const obj = JSON.parse(text);
  console.log(obj.status); //200

そして、不思議なことに、JSON.parse()メソッドは、HTTPResponseオブジェクトを、いきなり解析できます。

  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060';
  const response = UrlFetchApp.fetch(url);
  // const text = response.getContentText();

  const obj = JSON.parse(response);
  console.log(obj.status); //200

もし、ネット記事や書籍などで、このような書き方を見かけた際は、「文字列化の省略もできるんだ」と思ってください。

JSON.parse(‘文字列’)メソッドは、文字列をJSONとして解析し文字列をObject, Array, 文字列, 数値, 論理値, null 値のいずれかで返します。(何を返すのかは、指定されたJSONのtextに対応する値です)。

なぜ、省略できるのかは、いつかブログにしたいと思います。(公式リファレンスにもないので、わたしもまだ理解できていません。。。。)

POSTリクエストとJSON

以前、「JSONとはなにか」という記事を書いたことがあるので、こちらも是非参考にしてください。

記事が2020年11月に書いたものだったので、最新版にリニューアルしました。

以前よりは、わかりやすくなっていると思います。。。

まとめ

以上で、「HTTP通信・API」 をお届けしました。

次回は、卒業LT大会です。 内容は、、、「○○○」 をお届けします。お楽しみに!

このシリーズの目次

  1. [ノンプロ研]GAS中級講座6期Day1 スコープと関数
  2. [ノンプロ研]GAS中級講座6期Day2 クラス・ライブラリ
  3. [ノンプロ研]GAS中級講座6期Day3 組み込みオブジェクト
  4. [ノンプロ研]GAS中級講座6期Day4 Utility services1
  5. [ノンプロ研]GAS中級講座6期Day5 Utility services2
  6. [ノンプロ研]GAS中級講座6期Day6 HTTP通信・API
タイトルとURLをコピーしました