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
}