如何用Nodejs写soap的client端?

如何用Nodejs写soap的client端?

原来是用java写的,现在初学node.js,要改写。怎么弄啊,哪位大侠可以指点一下?原来的那个xml文档里面的内容要怎么写到args里面呢?还有Header里面的东西。 headers.setHeader(“Content-Type”,“text/xml”); headers.setHeader(“SOAPAction”,“http://xxx.com/runQuery”);

文档太少了。用的是node.js v0.10.7和milewise的soap模块。

var soap = require(‘soap’); var url = ‘http://xxx.com/xxx.asmx’; var args = {xxx:‘abc’}; soap.createClient(url, function(err, client) { client.RunQuery(args, function(err, result) { console.log(result); }); });

报错: Error: Unexpected root element of WSDL or include at null.<anonymous> (/home/taxi/nodeapp/node_modules/soap/lib/wsdl.js:907:23) at EventEmitter.emit (events.js:98:17) at Parser.parse (/home/taxi/nodeapp/node_modules/soap/node_modules/node-expat/lib/node-expat.js:18:22) at WSDL._parse (/home/taxi/nodeapp/node_modules/soap/lib/wsdl.js:920:12) at WSDL._fromXML (/home/taxi/nodeapp/node_modules/soap/lib/wsdl.js:928:29) at /home/taxi/nodeapp/node_modules/soap/lib/wsdl.js:584:18 at process._tickCallback (node.js:415:13)


9 回复

当然可以!下面是针对你的问题的详细解答,包括如何使用Node.js编写SOAP客户端。

如何用Node.js编写SOAP客户端

首先,你需要安装一个用于处理SOAP请求的库。常用的库有soap,你可以通过npm来安装它:

npm install soap

接下来,我们将逐步讲解如何创建一个简单的SOAP客户端,并解决你提到的错误。

示例代码

假设你有一个WSDL文件地址 http://example.com/service.asmx?wsdl,并且你想调用其中的一个方法 RunQuery

const soap = require('soap');
const url = 'http://example.com/service.asmx?wsdl';

// 定义请求参数
const args = {
    Param1: 'value1',
    Param2: 'value2'
};

// 创建SOAP客户端
soap.createClient(url, (err, client) => {
    if (err) {
        console.error("Error creating SOAP client:", err);
        return;
    }

    // 设置请求头(如果需要)
    client.setSecurity(new soap.BasicAuthSecurity('username', 'password'));

    // 调用SOAP方法
    client.RunQuery(args, (err, result) => {
        if (err) {
            console.error("Error calling RunQuery:", err);
            return;
        }

        console.log("Result:", result);
    });
});

解决WSDL解析错误

你提到的错误 Error: Unexpected root element of WSDL or include 通常是由于WSDL文件无法正确解析导致的。这可能是由于网络问题、WSDL文件格式问题或库版本问题。

  1. 检查WSDL URL:确保URL是可访问的,且返回有效的WSDL文件。
  2. 更新库版本:尝试更新soap库到最新版本。
  3. 调试WSDL解析:可以打印WSDL文件内容,查看是否有解析错误。
const request = require('request');

request(url, (error, response, body) => {
    if (error) {
        console.error("Error fetching WSDL:", error);
        return;
    }
    
    console.log(body); // 打印WSDL内容以供调试
});

XML文档中的内容

如果你需要将特定的XML内容作为参数传递,可以使用xml模块来构建XML字符串,并将其作为参数传递给SOAP方法。

const xmlbuilder = require('xmlbuilder');

const xml = xmlbuilder.create('RunQuery')
    .att('xmlns', 'http://example.com')
    .ele('Param1', 'value1')
    .ele('Param2', 'value2')
    .end({ pretty: true });

client.RunQuery({ xml: xml }, (err, result) => {
    if (err) {
        console.error("Error calling RunQuery:", err);
        return;
    }

    console.log("Result:", result);
});

以上就是如何使用Node.js编写SOAP客户端的基本步骤和解决常见问题的方法。希望这些示例代码能帮助你顺利迁移你的Java代码到Node.js。


好像没有必要自己写一个 https://npmjs.org/browse/keyword/soap

有可能是你的url写的不对

时间过去一年了,不知楼主当时的node soap项目怎么样了,我现在遇到的项目是个老项目,也要soap,有一些问题希望能向楼主请教请教

meteor项目中内嵌了soap使用ws没问题,跟IBM双通。 meteor内嵌的也是通过这个nodejs包改的。

现在很多协议都比soap强,http也很好使,更不用说Hessian

soap就是渣渣:(

你可以使用 soap 模块来创建一个 SOAP 客户端。以下是如何实现这一功能的步骤和示例代码:

步骤

  1. 安装 soap 模块:首先你需要安装 soap 模块。你可以使用 npm 来安装它:

    npm install soap
    
  2. 创建客户端:使用 soap.createClient 方法来创建一个 SOAP 客户端。

  3. 调用服务方法:通过客户端调用特定的服务方法,并传递参数。

示例代码

// 导入soap模块
const soap = require('soap');

// 服务URL
const url = 'http://example.com/service.asmx?wsdl';

// 参数
const args = {
    param1: 'value1',
    param2: 'value2'
};

// 设置请求头
const headers = {
    'Content-Type': 'text/xml',
    'SOAPAction': 'http://example.com/action'
};

// 创建SOAP客户端
soap.createClient(url, (err, client) => {
    if (err) {
        console.error('创建客户端时发生错误:', err);
        return;
    }

    // 调用服务方法
    client.runQuery(args, headers, (err, result) => {
        if (err) {
            console.error('调用服务方法时发生错误:', err);
            return;
        }

        // 输出结果
        console.log('服务返回的结果:', result);
    });
});

解释

  • soap.createClient 方法用于创建一个 SOAP 客户端。第一个参数是 WSDL URL,第二个参数是回调函数。
  • args 是传递给服务方法的参数对象。
  • headers 是包含请求头的对象,如 Content-TypeSOAPAction
  • 在回调函数中,你可以调用服务的方法并处理返回的结果或错误。

常见问题及解决方案

如果你遇到类似 Unexpected root element of WSDL or include 的错误,这通常意味着 WSDL 文件格式有问题或无法正确解析。你可以尝试以下几种方法:

  1. 检查 WSDL URL:确保 WSDL URL 是正确的,并且可以从浏览器访问。
  2. 使用其他 WSDL 解析器:如果当前的 WSDL 文件解析存在问题,可以考虑使用其他 WSDL 解析库,如 node-wsdl
  3. 更新依赖项:确保你使用的 soap 模块和其他依赖项都是最新的版本。

希望这些信息对你有所帮助!

回到顶部