首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过公司代理进行HTTPS SOAP调用- getaddrinfo ENOTFOUND

无法通过公司代理进行HTTPS SOAP调用- getaddrinfo ENOTFOUND
EN

Stack Overflow用户
提问于 2020-06-10 00:04:19
回答 2查看 353关注 0票数 0

我正在尝试通过HTTPS进行SOAP调用。通常我在Azure上做这件事,它工作得很好,但我正在开发一个新的模块,需要通过我们的公司代理在本地调用它。如果我只是正常地进行调用,我会收到一条SELF_SIGNED_CERTIFICATE_IN_CHAIN错误消息。在某些情况下,我可以使用https-proxy-agent模块解决这个问题,但是当我按照下面的方式设置它时,我得到了错误消息getaddrinfo ENOTFOUND undefined undefined:80。我确信代理URL是有效的。当我调试这个调用时,我可以看到代理信息被传递给这个调用(通过easy-soap-request发起SOAP调用,然后通过axios进行http调用)。下面是一些相关的代码片段:

代码语言:javascript
复制
const soapRequest = require('easy-soap-request');
let httpsProxyAgent = require('https-proxy-agent');
var agent = new httpsProxyAgent({hostname:'proxy.address.com', port:8080, rejectUnauthorized:false});

// Next lines are within the class of my helper function

await (async () => {
            var response = {};
            try {
                console.log('Converting catalog number...');
                console.log(url);
                response = await soapRequest(url, headers, requestXML, 10000, {httpsAgent:agent});

            } catch (err) {
                console.log(`Error converting catalog number: ${err}`);
                processObj.message = 'SERVICE_DOWN';
                processObj.error = err.message;
                return;
            }

// Then do some more stuff with the response, but I don't get this far

easy-soap-request模块本身似乎并没有做很多事情。这让我想知道为什么我不只使用request-promise-native (我在所有其他API调用中都使用它)来做post,但我想这是离题的。下面是easy-soap-request模块以供参考。我注意到的唯一一件事是它实际上使用的是axios-https-proxy-fix而不是axios

代码语言:javascript
复制
const axios = require('axios-https-proxy-fix');

module.exports = function soapRequest(url, headers, xml, timeout = 10000, proxy = false) {
  return new Promise((resolve, reject) => {
    axios({
      method: 'post',
      url,
      headers,
      data: xml,
      timeout,
      proxy,
    }).then((response) => {
      resolve({
        response: {
          headers: response.headers,
          body: response.data,
          statusCode: response.status,
        },
      });
    }).catch((error) => {
      if (error.response) {
        console.error(`SOAP FAIL: ${error}`);
        reject(error.response.data);
      } else {
        console.error(`SOAP FAIL: ${error}`);
        reject(error);
      }
    });
  });
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-10 09:15:06

看来我关于easy-soap-request实际上没有增加太多价值的评论被证明是正确的。我可以很容易地使用request-promise-native作为临时的替代品。因为后者考虑的是我的.env代理变量,所以我也不需要使用httpsAgent。我仍然不得不将rejectUnauthorized:false添加到选项中。以下是更新后的代码,将原始代码行注释掉:

代码语言:javascript
复制
//const soapRequest = require('easy-soap-request');
//let httpsProxyAgent = require('https-proxy-agent');
//var agent = new httpsProxyAgent({hostname:'proxy.address.com', port:8080, rejectUnauthorized:false});
const request = require('request-promise-native');

// Next lines are within the class of my helper function

await (async () => {
            var response = {};
            try {
                console.log('Converting catalog number...');
                console.log(url);
                //response = await soapRequest(url, headers, requestXML, 10000, {httpsAgent:agent});
                response = await request({
                    url: url,
                    method: 'POST',
                    headers: headers,
                    body: requestXML,
                    rejectUnauthorized: false
                })

            } catch (err) {
                console.log(`Error converting catalog number: ${err}`);
                processObj.message = 'SERVICE_DOWN';
                processObj.error = err.message;
                return;
            }

就像一种护身符!实际上,我将返回并更新我的其他集成模块,以便在整个应用程序中使用此方法而不是easy-soap-request

票数 0
EN

Stack Overflow用户

发布于 2021-06-11 00:27:23

使用4.1.3版测试成功。您以错误的方式向Axios发送参数

替换:

代码语言:javascript
复制
let httpsProxyAgent = require('https-proxy-agent');
var agent = new httpsProxyAgent({hostname:<>, port:<>, rejectUnauthorized:false});

使用:var proxy = {host:<>, port:<>};

和:const { response } = await soapRequest({ url: url, headers: sampleHeaders, xml: xml, timeout: 1000000, proxy: {httpsAgent: agent }});

使用const { response } = await soapRequest({ url: url, headers: sampleHeaders, xml: xml, timeout: 1000000, proxy});

库的文档应该更新,因为它没有显示使用代理的方法。

在您提出问题的时候:有一个与Axios proxy不工作有关的问题,但在您提出问题之前一年就关闭了:https://github.com/axios/axios/issues/2072#

使用proxyagent是当时提出的一种解决方法,请参阅此处的一个答案:How to use axios with a proxy server to make an https call?

考虑到这个答案,您必须将proxyAgent定义中的'hostname‘替换为'host’才能使您的代码正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62286878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档