我正在尝试通过HTTPS进行SOAP调用。通常我在Azure上做这件事,它工作得很好,但我正在开发一个新的模块,需要通过我们的公司代理在本地调用它。如果我只是正常地进行调用,我会收到一条SELF_SIGNED_CERTIFICATE_IN_CHAIN错误消息。在某些情况下,我可以使用https-proxy-agent模块解决这个问题,但是当我按照下面的方式设置它时,我得到了错误消息getaddrinfo ENOTFOUND undefined undefined:80。我确信代理URL是有效的。当我调试这个调用时,我可以看到代理信息被传递给这个调用(通过easy-soap-request发起SOAP调用,然后通过axios进行http调用)。下面是一些相关的代码片段:
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 fareasy-soap-request模块本身似乎并没有做很多事情。这让我想知道为什么我不只使用request-promise-native (我在所有其他API调用中都使用它)来做post,但我想这是离题的。下面是easy-soap-request模块以供参考。我注意到的唯一一件事是它实际上使用的是axios-https-proxy-fix而不是axios。
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);
}
});
});
};发布于 2020-06-10 09:15:06
看来我关于easy-soap-request实际上没有增加太多价值的评论被证明是正确的。我可以很容易地使用request-promise-native作为临时的替代品。因为后者考虑的是我的.env代理变量,所以我也不需要使用httpsAgent。我仍然不得不将rejectUnauthorized:false添加到选项中。以下是更新后的代码,将原始代码行注释掉:
//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。
发布于 2021-06-11 00:27:23
使用4.1.3版测试成功。您以错误的方式向Axios发送参数
替换:
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’才能使您的代码正常工作。
https://stackoverflow.com/questions/62286878
复制相似问题