nodejs中调用webservice接口填坑

nodejs调用webservide接口用到的模块是soap;

soap模块的安装使用

  • npm install soap --save
  • var soap = require(‘soap’)

soap模块调用webservice

soap模块api:node-soap
调用方法:
soap.createClient(url[,option],callback)

var soap = require('soap');
var url = '' //接口地址后面要加?wsdl
soap.createClient(url,function(err,client){
	client[method](params,function(err,result){
		console.log(result);
	})
	//也可以直接写
	/**
	client.methodName(params,function(err,result){
		console.log(result);
	})
	*/
})

以上为soap的简单调用。实际开发中特别是跟其他公司合作,因为wsdl文件基本都是自动生成的,接口的开发语言不一样生成的默认wsdl也会有个别差异,或者是手动生成wsdl每个人的设置也会有不一一样的地方。以下是我开发过程中遇到过的问题:

  • 接口地址加载出来后入参body元素下不包含方法名(注:soapui测试body元素下需要加上方法名才能调用成功)
  • 同第一条相反,加载后的xml包含方法名(注:soapui测试不加方法名才能调用成功)
  • 接口地址加载出来后入参body元素下方法名不包含前缀(注:soapui测试只有加上前缀之后才能调用成功)
  • soap信封里面包含请求头
  • 需要用到soap12的header去请求接口

示例与解决方案

第一种
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:tns="http://mmc.wzhh.cn/" xmlns:ns1="http://mmc.wzhh.cn/">
  <soap:Body>
    <ns1:GetReport>
      <ns1:input>?</ns1:input>
    </ns1:GetReport>
  </soap:Body>
</soap:Envelope>

上面是正确的入参,但是有时候加载出来会没有 < ns1:GetReport > 节点,导致调用接口失败。

解决办法

soap模块的wsdl.js文件中1579行代码做如下修改:

if (name == '' || name == null || name == undefined) {
	args = params;
} else {
    args[name] = params;
}

client调用接口方法前要执行代码:

client.wsdl.definitions.messages[menthod].element.$name = '方法名';
第二种

和第一种相反,前面的步骤都是一样的,只是client调用接口方法前name赋值为空字符串即可。

第三种

soap创建client时传入options参数,一般都能解决问题,options参数如下:

var options = {
	"ignoredNamespaces": {
               "namespaces": [],
               "override": true
           }
}
//调用
soap.createClient(url, options, function(err, client) {});

或者是先断点看下加载出来的入参,看所需的地址别名是什么,例如:xmlns:msc=“http://mmc.wzhh.cn/”,我们需要的就是在方法名前加前缀msc,做法

var options = {
    "overrideRootElement": {
        "namespace": "msc",
        "xmlnsAttributes":[{
        	"name":"xmlns:tem",
        	"value":"http://tempuri.org/"
        }]
    }
}

xmlnsAttributes节点下的内容是在方法名的标签添加属性,定义别名和属性值

第四种

将需要添加的header下的内容拼接为字符串,然后在client调用接口方法前执行client.addSoapHeader(headers);即可

var headers = '<AuthorizationSoapHeader xmlns="http://datareceive.service.esb.medata.com/">' +
            '<MDIP_ACCESSTOKEN>密钥</MDIP_ACCESSTOKEN>' +
            '</AuthorizationSoapHeader>';
soap.creatClient(url,options,(err,client)=>{
	if(!err){
		client.addSoapHeader(headers);
		client[method](params,function(err,result){})
	}
})
第五种

将soap请求改为soap12

var options = {
    "forceSoap12Headers": true
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章