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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章