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
}