Node.jsでAPIリクエストをするnode-fetchの使い方
node-fetchは、Node.js環境でAPIリクエストを行うためのモジュールです。 node-fetchを使うことで、Node.jsサーバ上で別サービスと連携を行うことができます。
本記事では、node-fetchの基本的な使い方を紹介します。
インストール
npm install node-fetch@2.6.6
require()
を使うために、バージョン2.6.6を指定します。
最新バージョンを使って、require('node-fetch');
を記述すると、Error [ERR_REQUIRE_ESM]: Must use import to load ES Moduleのようなエラーが出力されます。
バージョン3.xを使う場合はpackage.jsonへ"type": "module"
の追加が必要です。
また、利用時に次のように指定します。
import fetch from 'node-fetch';
本記事では、require()
を使ったサンプルを記載しています。
基本的な使い方
fetch(url, options)
でリクエストを行います。
下記は、GETメソッドで取得したページの内容を出力する例です。
'use strict';
const fetch = require('node-fetch');
fetch('https://www.google.com/', {
method: 'GET'
}).then((response) => {
if (!response.ok) {
throw 'error response';
}
// テキストの取得.
return response.text();
}).then((text) => {
console.log(text);
}).catch((error) => {
console.error(error);
});
オプション
よく使うオプションとして、次のようなものがあります。
キー | 型 | 内容 |
---|---|---|
method | 文字列 | リクエストメソッド |
headers | オブジェクト | リクエストに追加するヘッダ |
body | 様々 | POSTリクエストに追加する本体 |
その他のオプションは公式を確認ください。
Cookie を設定する
Cookieはオプションのheaders
で設定できます。
fetch(url, {
method: 'POST',
headers: {
'Cookie': cookie,
}
}).then((response) => {
});
formデータを送信する
formデータを送信するには、form-dataを利用します。
インストール
npm install form-data
formデータの送り方
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append(<field_name>, <field_value>);
// ファイルをアップロードする場合.
formData.append(<file_field_name>, fs.createReadStream(<ファイルパス>));
fetch(url, {
method: 'POST',
body: formData
}).then((response) => {
});
レスポンスヘッダの操作
レスポンスヘッダの値を取得する
レスポンスヘッダ内のヘッダの値はheaders.get(headerName)
で取得できます。
fetch(url, {
method: 'POST',
body: formData
}).then((response) => {
consol.log(response.headers.get('content-type'));
});
指定したヘッダ名が存在するかどうかを確認する
レスポンスヘッダ内に指定したヘッダ名が存在するかどうかはheaders.has(headerName)
で確認できます。
consol.log(response.headers.has('content-type'));
ReadableStream からデータを読み取る
Node.jsでHTTPレスポンスのReadable
ストリームからデータを読み取るには、次のような手順があります。
- レスポンスオブジェクトから
Readable
ストリームを取得する data
イベントを使用してデータを読み取るend
イベントでレスポンスの終了を受け取る
下記は、Response
オブジェクトのbody
プロパティを介してデータを読み取りRAWデータとして結合する例です。
const { Readable } = require('stream');
fetch(url, {
method: 'POST',
headers: {
},
body: formData
}).then((response) => {
return response.body;
}).then((body) => {
let rawBuffer = Buffer.alloc(0);
const readable = Readable.from(body);
readable.on('data', (data) => {
// レスポンスのデータを読み取る
// Bufferを結合して、新しいBufferを生成する.
rawBuffer = Buffer.concat([rawBuffer, data]);
});
readable.on('end', () => {
// レスポンスの終了時の処理.
});
}).catch((error) => {
console.error(error);
});
また、上記は次のように記述しても同じように動作します。
.then((response) => {
let rawBuffer = Buffer.alloc(0);
response.body.on('data', data => {
// Bufferを結合して、新しいBufferを生成.
rawBuffer = Buffer.concat([rawBuffer, data]);
});
response.body.on('end', () => {
// レスポンスの終了時の処理.
});
})