どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年9月から始まりました「ノンプロ研GAS中級講座6期」について、全7回でお届けします。今日はDay6です。
前回のおさらい
前回は、「Utilitiy services2」 をお届けしました。
今回は、 いよいよ最終回で 「HTTP通信・API」 をお届けします。
今日のアジェンダ
- HTTP通信とUrl Fetchサービス
- GETリクエスト
- 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大会です。 内容は、、、「○○○」 をお届けします。お楽しみに!