Javascript 使用节点soap(Node.js)中的数组发送请求
我正在使用nodejs和nodesoap与web服务通信。但我似乎无法获得将参数传递给服务的正确语法 文档中说我需要发送一个包含字段uuid及其值的数组 下面是我从web服务所有者那里得到的Php代码作为示例Javascript 使用节点soap(Node.js)中的数组发送请求,javascript,node.js,node-soap,Javascript,Node.js,Node Soap,我正在使用nodejs和nodesoap与web服务通信。但我似乎无法获得将参数传递给服务的正确语法 文档中说我需要发送一个包含字段uuid及其值的数组 下面是我从web服务所有者那里得到的Php代码作为示例 $uuid = "xxxx"; $param = array("uuid"=>new SoapVar($uuid, XSD_STRING, "string", "http://www.w3.org/2001/XMLSchema") ) 下面是我在节
$uuid = "xxxx";
$param = array("uuid"=>new SoapVar($uuid,
XSD_STRING,
"string", "http://www.w3.org/2001/XMLSchema")
)
下面是我在节点服务器中使用的代码
function getSoapResponse()
{
var soap = require('soap');
var url = 'http://live.pagoagil.net/soapserver?wsdl';
var auth = [{'uuid': 'XXXXXXXXX'}];
soap.createClient(url, function(err, client) {
client.ListaBancosPSE(auth, function(err, result)
{
console.log(result);
console.log(err);
});
});
有了这个,我得到了坏的xml错误
var auth = [{'uuid': 'XXXXXXXXX'}];
或
通过这个,我得到了响应“用户id为空”(uuid)
有什么建议吗?我能为您做的不多,但这里有一些建议可以帮助您开始
{ App_SoapService:
{ App_SoapPort:
{ Autorizar: [Object],
AutorizarAdvance: [Object],
AutorizarIac: [Object],
ListaBancosPSE: [Object],
AutorizarPSE: [Object],
AutorizarTuya: [Object],
AutorizarBotonCredibanco: [Object],
FinalizarPSE: [Object],
FinalizarTuya: [Object],
ConsultarReferencia: [Object] } } }
仔细查看特定方法ListaBancosPSE,它提供了以下信息:
{input: { auth: 'soap-enc:Array' },
output: { return: 'soap-enc:Array' }}
我试过这个:
var soap = require('soap');
function getSoapResponse(url, auth) {
soap.createClient(url, function(err, client) {
console.log(client.describe());
console.log(client.describe().App_SoapService.App_SoapPort.ListaBancosPSE);
client.ListaBancosPSE(auth, function(err, result) {
console.log(JSON.stringify(result));
console.log(err);
});
});
}
getSoapResponse('http://live.pagoagil.net/soapserver?wsdl', {'soap-enc:Array' : {'uuid': 'XXXXXXXXX'}});
回答是相同的“Negada,错误名称为usuario vacio,不在pagoagil.net中。”
接下来的步骤是确定服务所期望的消息
可能是这样的:
<tns:ListaBancosPSE><uuid>XXXXXXXXX</uuid></tns:ListaBancosPSE>
这将显示一条消息,该消息将为您提供足够的信息,以确定参数的格式。最后,使用应答中的内容并修改soap节点模块中的代码,我能够获得所需的代码 我需要这样的东西:
<auth xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">uuid</key>
<value xsi:type="xsd:string">{XXXXXX}</value>
</item>
</auth>
soap.createClient(url, myFunction);
function myFunction(err, client)
{
client.ListaBancosPSE(arrayToSend,function(err, result)
{
console.log('\n' + result);
});
}
var objToSend = {
someString: 'stringVal',
arrayContent: {
$xml: '<item>val1</item><item>val2</item>'
}
}
然后像这样发送:
<auth xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">uuid</key>
<value xsi:type="xsd:string">{XXXXXX}</value>
</item>
</auth>
soap.createClient(url, myFunction);
function myFunction(err, client)
{
client.ListaBancosPSE(arrayToSend,function(err, result)
{
console.log('\n' + result);
});
}
var objToSend = {
someString: 'stringVal',
arrayContent: {
$xml: '<item>val1</item><item>val2</item>'
}
}
然后棘手的部分是修改wsd.js
,这样它就不会每次使用和数组时都添加额外的标记。我转到第1584行,并为此更改了if:
if (Array.isArray(obj))
{
var arrayAttr = self.processAttributes(obj[0]),
correctOuterNamespace = parentNamespace || ns; //using the parent namespace if given
parts.push(['<', correctOuterNamespace, name, arrayAttr, xmlnsAttrib, '>'].join(''));
for (var i = 0, item; item = obj[i]; i++)
{
parts.push(self.objectToXML(item, name, namespace, xmlns, false, null, parameterTypeObject, ancXmlns));
}
parts.push(['</', correctOuterNamespace, name, '>'].join(''));
}
希望这能对使用该库并处于这种情况的人有所帮助。已经过去了几年,但我有另一个解决这个问题的建议。 如果您(像我一样)没有提供所有名称空间内容(由于缺乏理解),可以直接将序列化的XML字符串放入如下值:
<auth xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">uuid</key>
<value xsi:type="xsd:string">{XXXXXX}</value>
</item>
</auth>
soap.createClient(url, myFunction);
function myFunction(err, client)
{
client.ListaBancosPSE(arrayToSend,function(err, result)
{
console.log('\n' + result);
});
}
var objToSend = {
someString: 'stringVal',
arrayContent: {
$xml: '<item>val1</item><item>val2</item>'
}
}
var objToSend={
someString:'stringVal',
阵列内容:{
$xml:'val1val2'
}
}
它也不起作用。它是支付服务的中介。PHP和node.js是什么?它是一个Web服务。您可以从任何语言调用它,我试图从js调用它,但给出了一个如何使用PHP调用它的示例。没有任何混淆。我被告知如何用php调用Web服务。我也需要这样做,但是在JS和node JS中,node JS使用jsSo,所以您是否尝试过比较实际发送的请求?非常感谢Gus,真的。我今天会联系他们,弄清楚他们到底需要什么