HTTPリクエストを行う
Node.jsのhttpおよびhttpsモジュールはお世辞にも出来が良いとは言えない
モジュールが別れている時点ですでに察せると思う
新しくhttp2モジュールもできた
Node.js v17 で実験的ではあるが、--experimental-fetchフラグを渡すことで、Fetch APIが使えるようになったようだ
Node.js v18 からはフラグ無しでFetch APIが使えるようになりました
そこでライブラリの利用を考える。
以下よく使われるhttpクライアントライブラリ
加えてNode.js固有の独自拡張と制限の撤廃
禁止ヘッダーがない
discord.js v12、v13は内部でこのライブラリを使用している code:node-fetch.js
const fetch = require("node-fetch");
const body = { a: 1 };
method: 'post',
body: JSON.stringify(body),
headers: { 'Content-Type': 'application/json' },
})
.then(res => res.json())
.then(json => console.log(json));
リクエストに割り込み、リクエストを変更したりヘッダーを追加したりできる
レスポンスがJSONならばparseしたり400や500をrejectしたりとAPIを扱いやすように作られた感じ
code: axios.js
const axios = require('axios');
const body = { a: 1 };
.then(res => console.log(res.data));
method chainingを使ってリクエストを構築する
pluginと呼ばれる機構を使って拡張できる
code:superagent.js
const superagent = require('superagent');
const superagentJsonapify = require('superagent-jsonapify');
superagentJsonapify(superagent);
const body = { a: 1 };
superagent
.send(body)
.set('Content-Type','application/json')
.accept('json')
.then(res => console.log(res.json));
機能がとても豊富
ALPNを用いたhttp2に対応することができる
次期メジャーバージョン(12)でデフォルトで有効になる
code:got.js
const got = require('got');
const body = { a: 1 };
json: body,
responseType: 'json'
}).then(res => console.log(res.body.json));
もっと実用的な例にしたいtig.icon