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ストリームからデータを読み取るには、次のような手順があります。

  1. レスポンスオブジェクトからReadableストリームを取得する
  2. dataイベントを使用してデータを読み取る
  3. 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', () => {
        // レスポンスの終了時の処理.
    });
})
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です