gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:47 24 4
gpt4 key购买 nike

我正在使用 node-soap 编写 SOAP Node.js 网络服务而且我不知道如何正确地制定响应。

我正在使用 Web Connector 将 webapp 与 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 连接器)收到错误

我的 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”,但我不知道该怎么做;我对整个 SOAP 行业都是陌生的。

最佳答案

简答:

您的身份验证函数应如下所示:

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

说明:

您的代码有几处错误,我会发布每条错误消息,以便将来遇到相同问题的人更容易搜索到它们。

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

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

QBWC1012:身份验证因以下错误消息而失败。索引超出数组范围。

QBWC 不喜欢 node-soap 为数组创建的 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 跳过空字符串并且不将其包含在响应中,但 QBWC 正在寻找它(因此索引越界)。我发布的 hack-ish 解决方案将解决这两个问题:

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

关于javascript - 无法为 SOAP Node.js 制定响应对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20715056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com