如何在 Axios 中设置代理:权威指南

3 min read

本 Axios 代理指南涵盖以下主题:

  • 为何要在 Axios 中使用代理。
  • 如何在 Axios 中设置 HTTP、HTTPS 或 SOCKS 代理。
  • 如何进行身份验证和代理轮换。

Axios 是什么以及为何需要代理?

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

为何需要在 Axios 中使用代理?原因很简单!通过代理路由您的请求,您就可以掩盖自己的 IP 地址,使目标服务器更难识别和屏蔽您。这一额外的隐私保护层有助于维护应用程序的完整性,并避免 IP 禁令或限制。如我们在 node-fetch 代理指南中所述,您可使用 Fetch 获得相同的结果。

在 Axios 中使用代理

本 axios 代理章节介绍了在 Axios 中设置 HTTP、HTTPS 或 SOCKS 代理的具体操作方法。

前提

首先,确保您已安装 axios npm 包。通过以下命令将其添加至项目的依赖项中:

npm install axios 

在 Node.js 中,Axios 可通过代理配置原生支持 HTTP 和 HTTPS 代理。因此,如果您想在 Node.js 应用程序中通过 Axios 使用 HTTP/HTTPS 代理,那随时可使用它们!

如果您想改用非 HTTP/S 代理,则需要依赖委托代理 (Proxy Agent) 项目。它提供了 Http.Agent 实现,可以将 Axios 与不同协议类型的代理集成在一起。具体来说,按协议进行分类的话,该项目公开的各种 NPM 库包括:

太棒了!您已准备就绪,可以在 Axios 中设置代理了!

HTTP/HTTPS 代理

您的 HTTP/HTTPS 代理的 URL 应该是这样的:

"<PROXY_PROTOCOL>://<PROXY_HOST>:<PROXY_PORT>" 

对于 HTTP 代理, 应为 “http”,对于 HTTPS 代理, 应为 “https”。 通常为原始 IP,而 则为代理服务器监听的端口。

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

"http://47.88.62.42:80"

您可在 Axios 中按下述方法设置该代理:

axios.get(targetURL, {

    proxy: { 

        protocol: "http", 

        host: "48.88.62.42",

        port: "80"

    }

})

如您所见,本质而言,就是将代理 URL 分成两部分,并在代理配置中正确指定它们。Axios 现在将通过指定的 HTTP 代理服务器向作为参数传递的 URL 发出请求。

让我们来验证一下,上述 Axios 代理方法是否有效!

在线检索免费的 HTTP 或 HTTPS 代理服务器 URL。例如,这个免费的代理服务器 URL:

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

完整的代理 URL 应为 “http://52.117.157.155:8002”。

要验证此代理能否正常运行,您可在 HTTPBin 项目中指定 /ip 端点。因为该公共 API 返回的是传入请求的 IP,所以它应该返回代理服务器的 IP。

Node.js 脚本片段应为:

import axios from "axios"

async function testProxy() {

    // perform the desired request through the HTTP proxy

    const response = axios.get("https://httpbin.io/ip", {

        proxy: { 

            protocol: "http", 

            host: "52.117.157.155",

            port: "8002" 

        }

    })

    // print the result

    console.log(response.data)

}

testProxy()

执行脚本后它应记录:

{ "origin": "52.117.157.155" }

这与代理服务器的 IP 相同,表示代理服务器能正常运行,您的 IP 是安全的!

遗憾的是,如果您真的去运行这个脚本,将无法获得同样的结果。具体来说,它会出错。为什么呢?因为免费代理不但时效短,还不可靠!您可出于学习目的使用它们,但不能在实际场景中依赖它们。

警告:免费代理服务不可靠、速度慢、出错率高、时效短且会收集大量的用户数据。千万要避开他们! 

有何解决方案?使用市面上最好的代理服务提供商 Bright Data 的高级代理 。订阅并免费试用我们可靠的代理。

SOCKS 代理

如您尝试在代理配置对象的协议字段中设置 “socks” 字符串,则会出现以下错误:

AssertionError [ERR_ASSERTION]: protocol mismatch

  // ...

 {

  generatedMessage: false,

  code: 'ERR_ASSERTION',

  actual: 'dada:',

  expected: 'http:',

  operator: '=='

}

这是因为 Axios 本身不支持 SOCKS 代理。因此,您需要额外的依赖项才能实现预期的结果。

使用以下命令将 socks-proxy-agent npm 库添加到项目的依赖项中:

npm install socks-proxy-agent

这个包可以让您在 Axios 中发出 HTTP 或 HTTPS 请求后连接到 SOCKS 代理服务器。

然后,从库中导入 SOCKS 委托代理 (Proxy Agent) 实现:

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

或者,如果您是 ESM 用户:

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

假设这是您的 SOCKS 代理 URL:

"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 实例,以通过代理 URL 执行 HTTP/HTTPS 请求。

您现在可以在 Axios 中使用 SOCKS 代理了(如下所示):

axios.get(targetURL, { 

    httpAgent: proxyAgent,     

    httpsAgent: proxyAgent 

})

HttpAgent 和 httpsAgent 分别定义了执行 HTTP 和 HTTPS 请求时使用的自定义代理。换言之,Axios 发出的 HTTP 或 HTTPS 请求将通过指定的 SOCKS 代理。对于 https-proxy-agent npm 包,您也可以采用类似的操作,使之成为在 Axios 中设置 HTTP/HTTPS 代理的备选方法。

整体操作步骤如下所示:

import axios from "axios"

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

async function testProxy() {

    // replace with the URL of your SOCKS proxy 

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

    // define the HTTP/HTTPS proxy agent

    const proxyAgent = new SocksProxyAgent(proxyURL)

    // perform the request via the SOCKS proxy

    const response = await axios.get("https://httpbin.io/ip", { 

        httpAgent: proxyAgent,     

        httpsAgent: proxyAgent 

    })

    // print the result

    console.log(response.data) // { "origin": "183.88.74.73" }

}

testProxy()

点击链接查看如何在 Axios中配置 SOCKS 代理的其他示例。

Axios 代理:高级用例

您现在已了解 Axios 代理集成的基础知识,可以开始研究更复杂的技术了。

设置全局代理

您可以在 Axios 实例中直接指定代理来设置全局代理:

const axiosInstance = axios.create({

    proxy: { 

        protocol: "<PROXY_PROTOCOL>", 

        host: "<PROXY_HOST>",

        port: "<PROXY_PORT>" 

    },

    // other configs...

})

或者,如果您是委托代理 (Proxy Agent) 的用户,则可这么操作:

// proxy Agent definition ...

const axiosInstance = axios.create({

    httpAgent: proxyAgent,     

    httpsAgent: proxyAgent 

})

现在,使用 AxiosInstance 发出的所有请求都将自动通过指定的代理。

在 Axios 中进行代理身份验证

为仅允许付费用户访问高级代理, 代理服务提供商会通过身份验证对其进行保护。在没有用户名和密码的情况下连接已经过身份验证的代理将导致 407 Proxy Authentication Required 错误。

以下是经过身份验证的代理 URL 的具体语法:

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

例如,在现实世界中,连接至经过身份验证的代理的 URL 可能是这样的:

http://admin:[email protected]:8391

这种情况下,代理 URL 字段应为:

  • PROTOCOL>:HTTP
  • 156.127.0.192
  • 8391
  • admin 
  • lK4w90MEe45YIkOpk

要在 Axios 中进行代理身份验证,您只需在代理身份验证 (auth) 字段输入指定的用户名和密码即可:

axios.get(targetURL, {

    proxy: { 

        protocol: "http", 

        host: "156.127.0.192",

        port: "8381",

        auth: {

            username: "admin",

            password: "lK4w90MEe45YIkOpk"

        }

    }

})

大功告成!就这么简单!

如果您是委托代理 (Proxy Agent) 的用户,则可通过两种方法进行身份验证:

  1. 直接在代理 URL 中添加凭据:
var proxyAgent = new SocksProxyAgent("http://admin:[email protected]:8391")
  1. URL 对象中设置用户名密码选项:
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 请求的代理服务器的 URL。
  • HTTPS_PROXY:用于 HTTPS 请求的代理服务器的 URL。

例如,使用以下命令在 Linux 或 macOS 上设置它们:

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

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

当 Axios 检测到这些环境变量时,它会从中读取相关代理设置,例如身份验证凭据。将代理字段设置为 false 可使 Axios 忽略这些环境变量。请记住,您也可以将 NO_PROXY 环境变量定义为用逗号分隔的域名列表(表中域名均无需使用代理进行访问)。

请注意,这一机制也同样适用于在 cURL 中使用代理的情况。

实现代理轮换

如果您多次使用同一代理服务器,目标站点最终会封锁其 IP 地址。为防出现这种情况,您必须确保所执行的每个请求都来自不同的代理服务器。要实现这一目标,采用下述这一简单方法即可:

  1. 定义一个对象列表,每个对象都包含连接到不同代理的信息。
  2. 在每次请求前随机选择一个代理对象。
  3. 在 Axios 中配置选定的代理。

采用上述方法的前提是您可以访问可靠的代理服务器池。获得大量服务器的访问权限可能所费不菲。另外,将逻辑集成到您的代码中可能是件麻烦、枯燥的事情。

而这正是 Bright Data 可以帮忙的地方,它提供轮换代理功能,可自动为您切换 IP 地址!每次连接时,您都可以访问提供新 IP 地址的代理。这些代理服务器遍布 195 个国家/地区,提供极长的网络正常运行时间,且保证 99.9% 的成功率。试一试 Bright Data 的 轮换代理

结语

在本 Axios 代理教程中,您了解了在 Axios 中采用代理的原因和方法。您现在知道如何在 Axios 中设置 HTTP/HTTPS/SOCKS 代理了。如上文所述,只需几行代码即可!

您也认识到不应使用免费的代理服务。因此,您现在只需决定选择哪家代理服务提供商即可。为节省时间和精力,我们强烈推荐您选择 Bright Data,它是市面上最好的代理服务提供商。

Bright Data 掌控着全球最好的代理服务器,为财富 500 强企业和 20,000 多家客户提供服务。其全球代理网络包括:

整体而言,这是目前最大、最可靠的代理网络之一。联系我们的销售代表,了解哪款 Bright Data 产品最符合您的需求。