无法为SOAP Node.js制定响应对象

时间:2013-12-21 03:21:42

标签: javascript node.js soap wsdl quickbooks

我正在使用node-soap编写SOAP Node.js webservice,我无法弄清楚如何正确地制定响应。

我正在使用Web Connector将Web应用程序与QuickBooks 2013集成。客户端将发出身份验证请求,我可以记录传递的参数,因此我知道它正在被调用,但我无法得到正确的响应。

文档说它期待一个字符串数组作为响应。 WSDL的相关部分如下所示:

  <s:element name="authenticateResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="authenticateResult" type="tns:ArrayOfString" />
      </s:sequence>
    </s:complexType>
  </s:element>

  <s:complexType name="ArrayOfString">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
    </s:sequence>
  </s:complexType>

 <wsdl:message name="authenticateSoapOut">
    <wsdl:part name="parameters" element="tns:authenticateResponse" />
</wsdl:message>

<wsdl:operation name="authenticate">
  <wsdl:input message="tns:authenticateSoapIn" />
  <wsdl:output message="tns:authenticateSoapOut" />
</wsdl:operation>

 <wsdl:operation name="authenticate">
  <soap:operation soapAction="http://developer.intuit.com/authenticate" style="document" />
  <wsdl:input>
    <soap:body use="literal" />
  </wsdl:input>
  <wsdl:output>
    <soap:body use="literal" />
  </wsdl:output>
</wsdl:operation>

我尝试了许多不同的方法来配置响应对象,但不断从客户端获取错误(QuickBooks Web Connector)

我拥有的JavaScript是:

    var myService = {
          'QBWebConnectorSvc': {
              'QBWebConnectorSvcSoap': {
                  authenticate: function(args) {

                           //i have tried many variations of nesting arrays/objects etc.
                    var toReturn = {
                        "ArrayOfString":[guid()," "," "," "]
                    };
                    return toReturn;
                  }
              }
          }
      }

     var xml = require('fs').readFileSync('qbwc.wsdl', 'utf8'),
          server = http.createServer(function(request,response) {
              response.end("404: Not Found: "+request.url)
          });

    server.listen(8000);

    soap.listen(server, '/wsdl', myService, xml);

不知怎的,我需要构建“ArrayOfString”,但我不知道该怎么做;我是整个肥皂的新手。

1 个答案:

答案 0 :(得分:4)

简答:

您的身份验证功能应如下所示:

authenticate: function(args) {
    return {
        authenticateResult: { string: [guid(), {}] }
    };
}

说明:

您的代码存在一些问题,我会发布每个错误消息,以便将来对于遇到相同问题的任何人都更容易搜索。

QBWC1012:未将对象引用设置为对象的实例。

您应该在对象中返回authenticateResult,而不是ArrayOfString

QBWC1012:由于以下错误消息而导致身份验证失败。索引超出了数组的范围。

QBWC不喜欢node-soap为数组创建的XML响应。如果你在一个对象中返回一个数组,那么这就是node-soap产生的(相关部分):return { authenticateResult: [guid(), ""] }

<tns:authenticateResponse xmlns:tns="http://developer.intuit.com/" xmlns="http://developer.intuit.com/">
    <tns:authenticateResult>bdaa63cf-2d26-4d6b-8a54-6f519af6e8d4</tns:authenticateResult>
</tns:authenticateResponse>

这就是QBWC所期待的:

<tns:authenticateResponse xmlns:tns="http://developer.intuit.com/" xmlns="http://developer.intuit.com/">
    <tns:authenticateResult>
        <tns:string>bdaa63cf-2d26-4d6b-8a54-6f519af6e8d4</tns:string>
        <tns:string></tns:string>
    </tns:authenticateResult>
</tns:authenticateResponse>

第一个问题是名称空间错误。第二个是node-soap跳过空字符串并且不在响应中包含它,但是QBWC正在寻找它(因此索引超出范围)。我发布的hack-ish解决方案将解决这两个问题:

  • string对象中添加authenticateResult作为键的数组将更正命名空间
  • node-soap的objectToXML解析器会忽略空对象而不是空字符串