Nodejs Node soap client 调用java webservice 的问题
Nodejs Node soap client 调用java webservice 的问题
webservice暴露的接口是getUpcInfo(String barcode),node的代码是这样的:
soapclient = require('soap');
var detailsWsdl = "/home/test/Desktop/upcWsServer.xml";
soapclient.createClient(detailsUrl, function(err, client) {
client.getUpcInfo({'arg0': '000'}, function(err, result) {
console.log(result);
});
});
调用client.describe()的结果是这样的:
{ input: { arg0: ‘xs:string’ }, output: { return: ‘xs:string’ } }
可是webservice接受的参数总是null,各位大大知道问题在哪吗?
Node.js 使用 node-soap
客户端调用 Java WebService 的问题
问题描述
你正在使用 node-soap
库来调用一个 Java WebService 接口 getUpcInfo(String barcode)
。你的 Node.js 代码看起来是正确的,但是当 WebService 接收到请求时,参数总是为 null
。让我们一起来分析并解决这个问题。
示例代码
首先,确保你已经安装了 node-soap
库:
npm install soap
然后,你可以尝试以下代码:
const soap = require('soap');
// WSDL 文件路径
const wsdlPath = "/home/test/Desktop/upcWsServer.xml";
// 创建客户端
soap.createClient(wsdlPath, (err, client) => {
if (err) {
console.error("创建客户端失败:", err);
return;
}
// 调用 WebService 方法
client.getUpcInfo({ arg0: '000' }, (err, result) => {
if (err) {
console.error("调用方法失败:", err);
return;
}
console.log("结果:", result);
});
// 查看服务描述
const serviceDescription = client.describe();
console.log("服务描述:", serviceDescription);
});
问题分析
根据你提供的 client.describe()
输出,Web Service 期望的输入参数是 arg0
,类型为 xs:string
。这意味着你传递给 getUpcInfo
方法的参数应该是一个对象,其中键名为 arg0
。
解决方案
- 检查 WSDL 文件:确保 WSDL 文件中的定义与实际调用的参数匹配。WSDL 文件可能包含额外的配置或命名空间信息,这可能会影响客户端的行为。
- 调试和日志:在调用 WebService 前后添加详细的日志输出,以确认参数是否正确传递。
- 检查服务端配置:确保 WebService 端正确处理传入的参数。可以使用工具如 SoapUI 来验证 WebService 是否能正确接收和处理请求。
参考资料
通过以上步骤,你应该能够找到并解决参数传递不正确的问题。如果问题仍然存在,建议进一步检查 WSDL 文件和 WebService 的实现细节。
没人碰到过类似情况吗?还是我问的方式不对= =
这个问题解决了吗?
根据你的描述,问题可能出在参数传递的方式上。SOAP请求需要严格按照WSDL文件中定义的结构来构造。以下是一个调整后的示例代码,帮助你正确地构造和发送SOAP请求。
首先,确保你已经安装了soap
模块:
npm install soap
然后,尝试使用以下代码:
const soap = require('soap');
// WSDL URL
const wsdlURL = "file:///home/test/Desktop/upcWsServer.xml";
// Create a SOAP client
soap.createClient(wsdlURL, (err, client) => {
if (err) {
console.error("Error creating SOAP client:", err);
return;
}
// Get the service and operation name from the WSDL
const serviceName = Object.keys(client)[0];
const portName = client[serviceName].$value;
const operationName = Object.keys(client.getService(serviceName).portType.operation)[0];
// Construct the request object according to the WSDL
const request = {
arg0: '000'
};
// Call the service operation
client[serviceName][portName][operationName](request, (err, result) => {
if (err) {
console.error("Error calling getUpcInfo:", err);
return;
}
console.log("Result:", result);
});
});
解释:
- 创建SOAP客户端:使用
soap.createClient()
方法加载WSDL并创建一个SOAP客户端。 - 获取服务和操作名:从WSDL中提取服务名、端口名和操作名,以便正确调用服务。
- 构造请求对象:根据WSDL中的定义构造请求对象。在这个例子中,请求对象是一个包含
arg0
属性的对象。 - 调用服务操作:使用构造好的请求对象调用服务操作,并处理返回结果。
请确保WSDL路径正确,并且WSDL文件中的命名与你的服务一致。如果问题仍然存在,请检查WSDL文件是否正确配置以及Web服务端的日志以获取更多信息。