Axios の Node HTTP アダプターは、ホストと数値のポートを持つ HTTP プロキシオブジェクトを受け取ります。

import axios from 'axios';

const response = await axios.get('https://example.com/', {
  adapter: 'http',
  proxy: {
    protocol: 'http',
    host: '203.0.113.10',
    port: 8080,
  },
  timeout: 15000,
});

console.log(response.status);

文書用のエンドポイントを、利用サービスかHTTP プロキシ一覧の HTTP 項目に置き換えてください。この例は Node 用です。ブラウザーの Axios は、これらのオプションでブラウザーのネットワークプロキシを選べません。host フィールドには URL スキームを含まないアドレスを指定します。

プロキシオブジェクトの protocol はプロキシの待ち受け側を表します。Axios 1.21.0 の Node HTTP アダプターは HTTPS の接続先に CONNECT を使い、その後トンネル内でオリジンサーバーと TLS を交渉します。古いリリースでは別のプロキシ経路が使われていたため、インストールされたバージョンが重要です。

SOCKS URL には SOCKS エージェントが必要

HTTP プロキシオブジェクトでは SOCKS を選べません。代わりに互換性のあるエージェントを使います。

npm install [email protected] [email protected]
import axios from 'axios';
import { SocksProxyAgent } from 'socks-proxy-agent';

const agent = new SocksProxyAgent('socks5h://203.0.113.10:1080');

try {
  const response = await axios.get('https://example.com/', {
    adapter: 'http',
    httpAgent: agent,
    httpsAgent: agent,
    proxy: false,
    timeout: 15000,
  });
  console.log(response.status);
} finally {
  agent.destroy();
}

proxy: false は、SOCKS エージェントが提供する経路について Axios の HTTP プロキシ処理を無効にします。HTTP と HTTPS の両方の接続先にエージェントを渡すことで、両スキームをカバーします。ここでは socks5h が接続先の DNS 解決を SOCKS 側に委ねます。選んだサーバーはそのプロトコルに対応している必要があります。

失敗を読み解く

サイトが成功以外のステータスを返した場合、Axios のエラーにはレスポンスが含まれることがあります。なければエラーコードと接続の詳細を調べてください。モジュール不足、非対応プロトコル、互換性のない Node バージョンでは、リクエストがエンドポイントに届く前に失敗する場合があります。

認証付き HTTP プロキシには、プロキシオブジェクトの auth フィールドと運営者が提供した認証情報を使います。接続先の認証設定は別の相手に対するものです。

関連記事