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,各位大大知道问题在哪吗?


4 回复

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

解决方案

  1. 检查 WSDL 文件:确保 WSDL 文件中的定义与实际调用的参数匹配。WSDL 文件可能包含额外的配置或命名空间信息,这可能会影响客户端的行为。
  2. 调试和日志:在调用 WebService 前后添加详细的日志输出,以确认参数是否正确传递。
  3. 检查服务端配置:确保 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);
    });
});

解释:

  1. 创建SOAP客户端:使用soap.createClient()方法加载WSDL并创建一个SOAP客户端。
  2. 获取服务和操作名:从WSDL中提取服务名、端口名和操作名,以便正确调用服务。
  3. 构造请求对象:根据WSDL中的定义构造请求对象。在这个例子中,请求对象是一个包含arg0属性的对象。
  4. 调用服务操作:使用构造好的请求对象调用服务操作,并处理返回结果。

请确保WSDL路径正确,并且WSDL文件中的命名与你的服务一致。如果问题仍然存在,请检查WSDL文件是否正确配置以及Web服务端的日志以获取更多信息。

回到顶部