在 Axios 中设置代理

在 Axios 中设置代理

Axios 与代理

Axios 是 JavaScript 生态中最广泛使用的 HTTP 客户端之一。它基于 Promise,提供了易用、直观的 API,用于执行 HTTP 请求并处理自定义请求头、配置和 Cookie 等。

通过为 Axios 请求设置代理,您可以隐藏自己的 IP 地址,从而让目标服务器更难以识别并阻止您的请求。

在 Axios 中使用代理

让我们来看看如何在 Axios 中设置 HTTP、HTTPS 或 SOCKS 代理。首先,安装 axios

npm install axios

在 Node.js 环境中,Axios 原生支持通过 proxy 配置来使用 HTTP 和 HTTPS 代理。因此,如果您只需要在 Node.js 项目中使用 HTTP/HTTPS 代理,则无需额外操作。

但若您要使用非 HTTP/S 协议的代理,就需要借助 Proxy Agents 项目提供的 http.Agent 实现,它让 Axios 能够使用不同协议的代理:

HTTP/HTTPS 代理

您的 HTTP/HTTPS 代理的 URL 通常形式如下:

"<PROXY_PROTOCOL>://<PROXY_HOST>:<PROXY_PORT>"
  • <PROXY_PROTOCOL>:对于 HTTP 代理是 "http",对于 HTTPS 代理是 "https"。
  • <PROXY_HOST>:代理服务器的 IP 地址。
  • <PROXY_PORT>:代理服务器监听的端口号。

例如,假设这是您的 HTTP 代理的地址:

"http://47.88.62.42:80"

您可以在 Axios 中这样设置:

axios.get(targetURL, {
    proxy: {
        protocol: "http",
        host: "47.88.62.42",
        port: 80
    }
})

要验证这个配置方式是否可行,可以获取一个免费 HTTP 或 HTTPS 代理地址,比如:

Protocol: HTTP; IP Address: 52.117.157.155; Port: 8002

完整的代理地址就是 http://52.117.157.155:8002。为了验证代理是否生效,您可以通过 HTTPBin 项目的 /ip 接口测试请求。这个接口会返回请求的来源 IP,因此应该是代理服务器的 IP。

Node.js 中的测试代码片段示例如下:

import axios from "axios"

async function testProxy() {
    // 使用 HTTP 代理进行请求
    const response = await axios.get("https://httpbin.io/ip", {
        proxy: {
            protocol: "http",
            host: "52.117.157.155",
            port: 8002
        }
    });

    // 打印结果
    console.log(response.data)
}

testProxy()

运行脚本后,理想情况下会输出:

{ "origin": "52.117.157.155" }

警告

若您跟着示例代码直接运行,可能不会得到相同结果,因为免费代理服务通常不稳定、速度慢、容易出错,有的数据还可能被记录或解析,且通常时效很短。

SOCKS 代理

如果您尝试在 proxy 配置中将协议设置为 "socks",会出现如下错误:

AssertionError [ERR_ASSERTION]: protocol mismatch

  // ...

  {

    generatedMessage: false,

    code: 'ERR_ASSERTION',

    actual: 'dada:',

    expected: 'http:',

    operator: '=='

}

这是因为 Axios 并不原生支持 SOCKS 代理。为此,需要先安装 socks-proxy-agent

npm install socks-proxy-agent

该包允许您在进行 HTTP 或 HTTPS 请求时接入 SOCKS 代理。然后,引入 socks-proxy-agent 提供的 SOCKS 代理实现:

const SocksProxyAgent = require("socks-proxy-agent")

或若您使用 ESM:

import { SocksProxyAgent } from "socks-proxy-agent"

假设您的 SOCKS 代理地址是:

"socks://183.88.74.73:4153"

注意

代理协议可能是 "socks"、"socks5" 或者 "socks4"。

将它存到某个变量里,并传给 SocksProxyAgent 构造函数:

const proxyURL = "socks://183.88.74.73:4153"
const proxyAgent = new SocksProxyAgent(proxyURL)

SocksProxyAgent() 会初始化一个 http.Agent 实例,让所有 HTTP/HTTPS 请求都走这个代理地址。

在 Axios 中使用 SOCKS 代理可以这样做:

axios.get(targetURL, {
    httpAgent: proxyAgent,    
    httpsAgent: proxyAgent
})

httpAgenthttpsAgent 指定了在进行 HTTP/HTTPS 请求时应使用的自定义代理类。也就是说,Axios 发出的 HTTP 或 HTTPS 请求都会走这里指定的 SOCKS 代理。同理,您也可以使用 https-proxy-agent 来为 Axios 设置 HTTP/HTTPS 代理。

示例如下:

import axios from "axios"
import { SocksProxyAgent } from "socks-proxy-agent"

async function testProxy() {
    // 将代理 URL 替换成您自己的 SOCKS 代理地址
    const proxyURL = "socks://183.88.74.73:4153"
    // 定义 HTTP/HTTPS 代理 agent
    const proxyAgent = new SocksProxyAgent(proxyURL)
    // 通过 SOCKS 代理发送请求
    const response = await axios.get("https://httpbin.io/ip", {
        httpAgent: proxyAgent,    
        httpsAgent: proxyAgent
    })

    // 打印结果
    console.log(response.data) // { "origin": "183.88.74.73" }
}

testProxy()

如需更多关于在 Axios 中配置 SOCKS 代理的示例,可查看此链接:
如何在 Axios 中使用 SOCKS 代理

Axios 代理:进阶用法

全局设置代理

如果您想在所有请求中都使用同一个代理,可以直接在 Axios 实例中进行全局设置:

const axiosInstance = axios.create({
    proxy: {
        protocol: "<PROXY_PROTOCOL>",
        host: "<PROXY_HOST>",
        port: "<PROXY_PORT>"
    },
    // 其他配置...
})

或者,如果您使用了 Proxy Agents:

// 定义代理 agent ...

const axiosInstance = axios.create({
    httpAgent: proxyAgent,    
    httpsAgent: proxyAgent
})

以下示例演示了如何全局使用 SOCKS 代理:

import { SocksProxyAgent } from "socks-proxy-agent";

const proxyURL = "socks://183.88.74.73:4153";

// 创建一个 SOCKS 代理 agent
const proxyAgent = new SocksProxyAgent(proxyURL);

// 创建一个 Axios 实例,全局应用该 SOCKS 代理
const axiosInstance = axios.create({
    httpAgent: proxyAgent, // 用于 HTTP 请求
    httpsAgent: proxyAgent, // 用于 HTTPS 请求
    // 其他配置...
});

现在使用 axiosInstance 发出的所有请求都会自动走该代理。

在 Axios 中处理需要身份验证的代理

为了只允许付费用户使用高质量的代理,一些代理服务商会要求进行身份验证(用户名 + 密码)。若您不带用户名 / 密码地尝试连接到此类代理服务器,就会收到 407 Proxy Authentication Required 错误。

一般情况下,需要身份验证的代理地址格式如下:

[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]

例如,一个示例地址可能是:

http://admin:lK4w90MEe45YIkOpk@156.127.0.192:8391

对应的要素分解如下:

  • <PROTOCOL>: http
  • <HOST>: 156.127.0.192
  • <PORT>: 8391
  • <USERNAME>: admin
  • <PASSWORD>: lK4w90MEe45YIkOpk

如果您使用 Axios 原生的 proxy,可以在 auth 字段中声明用户名和密码:

axios.get(targetURL, {
    proxy: {
        protocol: "http",
        host: "156.127.0.192",
        port: "8381",
        auth: {
            username: "admin",
            password: "lK4w90MEe45YIkOpk"
        }
    }
})

若您是使用 Proxy Agents,可以通过以下两种方式处理代理验证:

  1. 直接在代理 URL 中加入认证信息:

    var proxyAgent = new SocksProxyAgent("http://admin:[email protected]:8391")
    
  2. 通过 URL 对象设置 usernamepassword

    const proxyOpts = new URL("http://156.127.0.192:8391")
    proxyOpts.username = "admin"
    proxyOpts.password = "lK4w90MEe45YIkOpk"
    
    const proxyAgent = new SocksProxyAgent(proxyOpts)
    

对于 HttpsProxyAgent 也同理。

通过环境变量设置代理

另一个在 Axios 中全局配置代理的方式是通过环境变量:

  • HTTP_PROXY: 用于 HTTP 请求的代理服务器地址。
  • HTTPS_PROXY: 用于 HTTPS 请求的代理服务器地址。

在 Linux 或 macOS 上,您可以这样设置:

export HTTP_PROXY="[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]"
export HTTPS_PROXY="[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]"

当 Axios 检测到这些环境变量后,会读取相应的代理配置,包括身份验证所需的凭据。若您想忽略这些环境变量,可将 proxy 字段设置为 false。也可以定义一个名为 NO_PROXY 的环境变量,以逗号分隔列出不需要走代理的域名。

同样的机制也可用于 通过 cURL 使用代理

实现轮换代理

为了防止目标站点因多次请求同一 IP 而对您的代理进行封锁,您可以让每次请求都使用不同的代理地址:

  1. 定义一个包含多个代理信息的列表。
  2. 在每次请求前随机(或按一定规则)从列表中选择一个代理。
  3. 将选定的代理配置信息传给 Axios。

这种方式需要您拥有一个可用的代理池,诸如 Bright Data 提供的 轮换代理 就可以满足此需求。

结论

Bright Data 拥有全球领先的代理网络,为世界 500 强企业及超过 20,000 名客户提供服务。其全球代理网络覆盖多种类型:

立即免费注册 Bright Data 账户 试用我们的代理服务器吧。

相关推荐
NocoBase34 分钟前
使用Langflow和AstraDB构建AI助手:从架构设计到与NocoBase的集成
人工智能·低代码·开源·api·开发工具
学习嵌入式的小羊~5 小时前
远程监控项目描述以及总体框架
网络协议·http
还是鼠鼠6 小时前
http 模块的概念及作用详细介绍
前端·javascript·vscode·http·node.js·web
程序员黄同学8 小时前
谈谈 HTTP 中的重定向,如何处理301和302重定向?
网络·网络协议·http
与光同尘 大道至简8 小时前
万字技术指南STM32F103C8T6 + ESP8266-01 连接 OneNet 平台 MQTT/HTTP
stm32·单片机·嵌入式硬件·物联网·http·docker·信息与通信
XiaoLeisj8 小时前
【计算机原理】深入解析 HTTP 中的 URL 格式、结构和 URL encode 转义与 URL decode 逆转义原理
网络·网络协议·tcp/ip·http·fiddler·信息与通信
ZZZ_Tong8 小时前
HTTP拾技杂谈
java·网络·网络协议·http
WoTrusSSL9 小时前
网站总报SSL错误?常见原因及解决方案
网络协议·https·ssl
m0_748240449 小时前
Nginx 配置 SSL(HTTPS)详解
nginx·https·ssl
孟陬10 小时前
发现某官方网站的一个服务端 Bug 🐞?
http