如何使用 axios 进行 https 调用?

Posted

技术标签:

【中文标题】如何使用 axios 进行 https 调用?【英文标题】:How to use axios to make an https call? 【发布时间】:2017-08-31 14:47:51 【问题描述】:

我正在尝试将 axios 与代理服务器一起使用来进行 https 调用:

const url = "https://walmart.com/ip/50676589"
var config =  proxy:  host: proxy.ip, port: proxy.port  

axios.get(url, config)
.then(result => )
.catch(error => console.log(error))

我使用的代理服务器都在美国,高度匿名,支持 HTTP 和 HTTPS。

我收到此错误:

错误:写入 EPROTO 140736580649920:error:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知 协议:../deps/openssl/openssl/ssl/s23_clnt.c:794:

为了确保问题出在 axios 而不是代理,我尝试了这个:

curl -x 52.8.172.72:4444 -L 'https://www.walmart.com/ip/50676589'

这完全可以正常工作。

如何配置 axios 以使用代理和 https URL?

【问题讨论】:

【参考方案1】:

看this issue就可以解决这个问题

在此解决方案中,请改用代理接口,使用 http(s)Agent。 为此,解决方案使用本机节点模块https-proxy-agent

var ProxyAgent = require('https-proxy-agent');
var axios = require('axios');

const agent = ProxyAgent('http://username:pass@myproxy:port')

var config = 
  url: 'https://google.com',
  proxy: false,
  httpsAgent: agent
;

要正常工作,代理属性必须等于 false。

【讨论】:

【参考方案2】:

我知道这是一篇旧帖子,但我希望这个解决方案可以为任何面临Axios 的 SSL 问题的人节省时间。

你可以使用HTTP代理,我建议使用hpagent
const axios = require("axios");
const  HttpProxyAgent, HttpsProxyAgent  = require("hpagent");

async function testProxy() 
  try 
    const proxy = "http://username:password@myproxy:port";
    // hpagent configuration
    let agentConfig = 
      proxy: proxy,
      // keepAlive: true,
      // keepAliveMsecs: 2000,
      // maxSockets: 256,
      // maxFreeSockets: 256,
    ;
    axios.defaults.httpAgent = new HttpProxyAgent(agentConfig);
    axios.defaults.httpsAgent = new HttpsProxyAgent(agentConfig);
    // Make a simple request to check for the IP address.
    let res = await axios.get("https://api.ipify.org/?format=json");
    console.log(res.data);
   catch (error) 
    console.error(error);
  


testProxy();

【讨论】:

【参考方案3】:

https-proxy-agentnode-tunnel 解决方案确实对我有用,但它们都不支持使用 NO_PROXY 的条件代理。

我发现 global-agent 是我的最佳解决方案,因为它修改了核心 http 和 https 对象,并将自动应用于任何使用它们的库,包括 axiosgotrequest等。

用法很简单。

npm i global-agent
npm i -D @types/global-agent

import 'global-agent/bootstrap'; 添加到服务器的入口点 (index.ts)。

使用这些环境变量运行并确保 HTTP_PROXY、HTTPS_PROXY 不在环境中。

export GLOBAL_AGENT_NO_PROXY='*.foo.com,baz.com'
export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8080

这就是我最终使用它的方式。

import  bootstrap  from 'global-agent';

const proxy = process.env.EXTERNAL_PROXY;

if (proxy) 
  process.env.GLOBAL_AGENT_HTTP_PROXY = proxy;
  process.env.GLOBAL_AGENT_NO_PROXY = process.env.NO_PROXY;
  process.env.GLOBAL_AGENT_FORCE_GLOBAL_AGENT = 'false';
  bootstrap();
  logger.info(`External proxy $proxy set`);

【讨论】:

【参考方案4】:

上周(2020 年 2 月)更新我的依赖项试图找出服务停滞的原因时,我浪费了一天的工作。 axios-https-proxy-fix 将导致 Axios 无限期挂起而不会超时或抛出与 npm 中其他库冲突的错误。使用节点隧道 (https://github.com/koichik/node-tunnel) 创建代理也可以。

const tunnel = require('tunnel');
class ApiService 
  get proxyRequest() 
    const agent = tunnel.httpsOverHttp(
      proxy: 
        host: 'http://proxy.example.com',
        port: 22225,
        proxyAuth: `username:password`,
      ,
    );
    return axios.create(
      agent,
    )
  

【讨论】:

【参考方案5】:

尝试在 URL 中明确指定端口:

const url = "https://walmart.com:443/ip/50676589"

如果您还需要 HTTPS-over-HTTP 隧道,您可以在 this article 中找到解决方案。

希望这会有所帮助,

一月

【讨论】:

为什么要投反对票? Axios 有(有?)一个问题,指定端口号会强制它使用 https 代理而不是 http 代理。【参考方案6】:

试试这个。这对我有用。

第一

npm install axios-https-proxy-fix

然后

import axios from 'axios-https-proxy-fix'; 

const proxy = 
  host: 'some_ip',
  port: some_port_number,
  auth: 
    username: 'some_login',
    password: 'some_pass'
  
;

async someMethod() 
  const result = await axios.get('some_https_link', proxy);

【讨论】:

【参考方案7】:

如果使用 https 代理,Axios https 代理支持会被破坏。尝试使用 http 通过[httpsProxyAgent][1] 传递代理。

var axios = require('axios'); 

let httpsProxyAgent = require('https-proxy-agent');
var agent = new httpsProxyAgent('http://username:pass@myproxy:port');

var config = 
  url: 'https://google.com',
  httpsAgent: agent


axios.request(config).then((res) => console.log(res)).catch(err => console.log(err))

或者,有一个 Axios 的分支包含此:axios-https-proxy-fix,但我推荐第一种方法来确保最新的 Axios 更改。

【讨论】:

url 应该在配置之外,否则你会得到错误“The url argument must be of type string”。 @cyberspace 你在说什么?请求方法需要一个配置对象。你用 get/post 试过了吗?因为那些确实需要单独的网址。文档:github.com/axios/axios#request-method-aliases 在我的情况下还必须在配置中添加 proxy: false【参考方案8】:

这个错误是因为 axios 试图通过 https 代理你的请求(它从你的 url 中获取),有这张票在跟踪它:https://github.com/axios/axios/issues/925

【讨论】:

以上是关于如何使用 axios 进行 https 调用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 调用 API 时如何防止 UI 冻结

如何在没有 CORS 错误的情况下使用 axios 对 Instagram 进行 api 调用

如何使用 Axios 从 localhost VueJS 调用服务器?

如何使用 redux 和 redux-promise 将多个 axios 调用合并到一个有效负载中?

如何在 axios API 调用中使用“useParams()”?

用 Axios 承诺一切