Axios请求第三方SOAP API时IP地址连接被拒绝问题求助
问题描述
向第三方SOAP API发起请求时,直接使用IP地址http://XXX.XXX.XXX.XXX:40871收到连接拒绝错误:
{ "success": false, "error": "connect ECONNREFUSED XXX.XXX.XXX.XXX:40871", "trace": "Error: connect ECONNREFUSED XXX.XXX.XXX.XXX:40871\n at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1187:16)" }
本地通过修改hosts文件将该IP映射为域名my-host-name.com后,请求http://my-host-name.com:40871可正常响应。但生产环境部署在Heroku,无法修改hosts文件,且第三方API要求白名单静态IP,当前使用Axios配合HttpsProxyAgent通过静态IP代理请求。
解决方案
核心原因是第三方服务器大概率基于Host请求头做路由或白名单校验:本地修改hosts后,请求的Host头会被自动设置为映射的域名;而直接用IP请求时,Host头是IP地址,导致服务器判定为非法请求并拒绝连接。
方法1:手动添加Host请求头(优先推荐)
在请求的headers中显式添加Host字段,值为本地映射的域名my-host-name.com,同时保留IP作为baseURL。修改后的请求体示例:
{ "method": "POST", "baseURL": "http://XXX.XXX.XXX.XXX:40871", "url": "/IDORequestService/IDOWebService.asmx", "data": {{xmlBody}}, "headers": { "Content-type": "text/xml", "SOAPAction": "http://frontstep.com/IDOWebService/CreateSessionToken", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Host": "my-host-name.com" } }
此方法完全模拟了hosts映射后的请求头结构,让第三方服务器识别为合法请求。
方法2:适配代理与请求协议匹配
当前代码使用HttpsProxyAgent,但目标API是HTTP协议。若代理服务器支持HTTP代理,可替换为HttpProxyAgent(需先安装http-proxy-agent包),避免代理协议不匹配的潜在问题:
const { HttpProxyAgent } = require('http-proxy-agent'); const agent = new HttpProxyAgent(process.env.STATIC_URL!); const baseOptions: AxiosRequestConfig = { proxy: false, httpAgent: agent, // 改用httpAgent适配HTTP请求 }; const instance = axios.create(baseOptions);
若代理仅支持HTTPS,则保留HttpsProxyAgent即可,核心仍需配合方法1添加Host头。
环境信息
- Axios v0.27.2
- https-proxy-agent: v5.0.1
- Node.js v16.16.0
- 部署环境:Heroku;本地OS:Windows 11/Linux Mint 19.3
内容的提问来源于stack exchange,提问作者BilalZ
相关产品推荐
相关产品推荐

