Javascript 使用节点soap(Node.js)中的数组发送请求

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") ) 下面是我在节

我正在使用nodejs和nodesoap与web服务通信。但我似乎无法获得将参数传递给服务的正确语法

文档中说我需要发送一个包含字段uuid及其值的数组

下面是我从web服务所有者那里得到的Php代码作为示例

$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)


有什么建议吗?

我能为您做的不多,但这里有一些建议可以帮助您开始

  • 使用client.descripe()查看服务如何期望参数
  • 您尝试访问的服务具有以下结构:

    { 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,真的。我今天会联系他们,弄清楚他们到底需要什么