やりたいこと
node.jsの標準のhttpsモジュールでAPIへのリクエストを実行したい。
node.jsでHTTPリクエストを行う際には、requestモジュールが使われるケースが多かったようだが、2020/2/11でdeprecatedになったようなので、代わりにnode.jsの標準モジュールで実行したい。
実装
以下のような実装でリクエストを実行できた。
APIは、zipcloud 郵便番号APIを試しに叩いている。
const https = require('https'); // 1: 標準のhttpsモジュールを使用
https.get('https://zipcloud.ibsnet.co.jp/api/search?zipcode=1000000', (res) => {
if (res.statusCode !== 200) { // 2: status codeが200以外の場合はエラーとする
console.error("failed to get data. status code: %d", res.statusCode);
return;
}
let rawData = '';
res.on('data', (chunk) => { // 3: res.on('data', callback関数) で、responseのbodyデータをストリーム形式で処理してくれる。ここではchunkという変数にstreamデータを追加式に格納している。
rawData += chunk;
});
res.on('end', () => { // 4: res.on('end', callback関数) で、responseのbodyデータを読み終わった後の処理を定義。
try {
const parsedData = JSON.parse(rawData); // 5. 今回はレスポンスデータがjson形式なのでJSON.parseして、それをログ出力している
console.log(parsedData) ;
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(e)
});
コードの説明
1. 標準のhttpsモジュールを使用
標準のhttpsモジュールをrequireしています
2: status codeが200以外の場合はエラーとする
一応、status code(res.statusCode
)が200以外の場合はエラー扱いしてログを出力しています。
3: res.on('data', callback関数) で、responseのbodyデータを処理
res.on('data', callback関数) で、responseのbodyデータを処理できます。bodyデータはストリームデータの形式でcallback変数の引数(ここではchunk
)に細切れで渡されてくるため、事前に用意しておいた結果格納用変数(rawData
)に、細切れごと(ループ内の1回処理ごと)に追加で格納していくという処理を行っています。
node.jsのストリームデータに関しては、こちらのブログ記事やQiitaここちらの記事などが参考になります。
4: res.on('end', callback関数) で、responseのbodyデータを読み終わった後の処理を定義
res.on('end', callback関数) で、responseのbodyデータを読み終わった後の処理を定義できます。
5. 今回はレスポンスデータがjson形式なのでJSON.parseして、それをログ出力している
今回はレスポンスデータがjson形式なのでJSON.parseして、単純にそれをログ出力しています。
実行結果
上記のファイルをindex.jsという名前で保存して、nodeコマンドで実行する。
APIの実行結果が出力される。
$ node index.js
{
message: null,
results: [
{
address1: '東京都',
address2: '千代田区',
address3: '',
kana1: 'トウキョウト',
kana2: 'チヨダク',
kana3: '',
prefcode: '13',
zipcode: '1000000'
}
],
status: 200
}
感想
標準のhttpsモジュールを使用した場合、responseのbodyデータを処理する際に、わざわざstreamデータを取り出す処理を実装しないといけないのが少し面倒だと思った。
requestモジュールなサードパーティのモジュールどを使うと、この辺の処理はモジュール内で良い感じで処理してくれていて呼び出し側では意識する必要がないのは良い。
とはいえ、それ以外はそれほど複雑な実装は必要ないので、上記のような処理を定形処理として覚えてしまっておけば、(わざわざ追加のモジュールを入れずに)標準モジュールだけでサクッとHTTP requestを実装できて便利そう。
参考
公式サイトに記載のサンプルコードを参考にしました。
node.js公式 httpsモジュールのgetメソッドの解説
node.js公式 httpモジュールのgetメソッドの解説 ※httpsモジュールのhttp(非SSL)版