在 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 账户 试用我们的代理服务器吧。

相关推荐
天远云服17 小时前
高并发风控实践:AES 加密与银行卡风险标签清洗的 Go 语言实现
大数据·api
该用户已不存在18 小时前
Let’s Encrypt 证书有效期将缩至 45 天,运维天都塌了
运维·https·自动化运维
Hommy8818 小时前
剪映智能剪辑API汇总
api·剪映小助手·智能剪辑
小玉不愚鸭19 小时前
nginx中的https的搭建
运维·nginx·https
羊村积极分子懒羊羊20 小时前
nginx的https的搭建
运维·nginx·https
MegatronKing20 小时前
SSL密钥协商导致抓包失败的原因分析
前端·https·测试
超级大只老咪1 天前
常用 HTTP 状态码汇总
网络·网络协议·http
Zabbix_China1 天前
零配置方案:Zabbix + HTTP 代理实现内网穿透工具的自动化管理
http·自动化·zabbix
苏打水com1 天前
浏览器与HTTP核心考点全解析(字节高频)
前端·http
古城小栈1 天前
SSE 流式传输技术:后端 说话 前端 听着
websocket·http·信息与通信