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

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

我正在使用Web连接器将Web应用程序与QuickBooks 2013集成在一起。 客户端将请求进行身份validation,我可以logging传递的参数,所以我知道它被调用,但我无法得到正确的答复。

该文件说,它期待一个string数组作为响应。 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> 

我已经尝试了许多不同的方式来configuration响应对象,但不断从客户端(QuickBooks Web连接器)

我拥有的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); 

不知何故,我需要build立“ArrayOfString”,但我不知道如何去做; 我是整个肥皂的新东西。

简短的回答:

您的身份validationfunction应如下所示:

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

说明:

你的代码有两个错误,我会发布错误信息,以便将来有相同问题的人更容易search。

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

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

QBWC1012:由于以下错误消息,身份validation失败。 指数数组的边界之外。

QBWC不喜欢node-soap为数组创build的XML响应。 如果你在一个对象中返回一个数组(如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跳过空string,不包括它在响应中,但QBWC正在寻找它(因此索引越界)。 我发布的hack-ish解决scheme将解决这两个问题:

  • authenticateResult对象中添加一个string作为其键的数组将更正名称空间
  • node-soap的objectToXMLparsing器不会忽略空对象而不是空string。