2017-05-31 98 views
1

用盡了最後一天的感觸,並希望得到任何幫助!將屬性添加到node.js中的SOAP消息中(node-soap)

我正在構建一個消耗第三方SOAP Web服務的應用程序。這是基於node.js並使用node-soap。不幸的是,WSDL文件有點壞,我需要按照自己的方式工作。

這是我使用的代碼:

var url = 'http://domainexample.com/ws/connectionService.cfc?wsdl'; 
var session = 'super secret string' 
var args = { connectionID: session } 

soap.createClient(url, function (err, client) { 
    client.connectionService_wrapService['connectionservice.cfc'].isConnected(args, function (err, result) { 
     console.log(result); 
    }); 
}); 

這是我的錯誤。大多數其他方法做工精細:

org.xml.sax.SAXException:反序列化參數\ '的ConnectionId \':無法爲類型{ http://www.w3.org/2001/XMLSchema} anyType的'找到解串器

這是消息由該方法生成的:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:impl="http://rpc.xml.cfml/ 
ws/ConnectionService.cfc" xmlns:intf="http://rpc.xml.cfml/ws/ConnectionService.cfc"> 
    <soap:Body> 
    <impl:isConnected> 
     <connectionID>super secret string</connectionID> 
    </impl:isConnected> 
    </soap:Body> 
</soap:Envelope> 

我發現,WSDL文件不具有對於一些方法(如這一個)所述的ConnectionId參數定義的適當的類型屬性。它應該是xsd:string,這就是我稱之爲工作的方法。

後一些與SOAP UI玩弄我發現添加一種類型的屬性(的xsi:type = XSD:串)到的ConnectionId一部分,並添加一個模式(的xmlns:XSD =「HTTP://www.w3 .org/2001/XMLSchema「)修復它。這是我需要生成XML:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:impl="http://rpc.xml.cfml/ 
ws/ConnectionService.cfc" xmlns:intf="http://rpc.xml.cfml/ws/ConnectionService.cfc"> 
    <soap:Body> 
    <impl:isConnected> 
     <connectionID xsi:type="xsd:string">auth-string-here</connectionID> 
    </impl:isConnected> 
    </soap:Body> 
</soap:Envelope> 

但我想不出我的生活中,我如何通過節點肥皂做到這一點。我嘗試使用屬性鍵添加一個類型,但它似乎只有在參數中有父節點和子節點時才起作用。

所以,如果我傳下來:

var args = { 
    test: { 
     connectionID: 
     { 
      attributes: { 
       'xsi:type': 'xsd:string' 
      }, 
      $value: session 
     } 
    } 
}; 

我得到如下:

<impl:isConnected> 
    <test> 
    <connectionID xsi:type="xsd:string">super secret string</connectionID> 
    </test> 
</impl:isConnected> 

但我只需要一個級別,這樣的:

var args = { 
    connectionID: 
    { 
     attributes: { 
      'xsi:type': 'xsd:string' 
     }, 
     $value: session 
    } 
}; 

所以我得到這個:

<impl:isConnected> 
    <connectionID xsi:type="xsd:string">super secret string</connectionID> 
</impl:isConnected> 

但這似乎並沒有發生。實際上,當我將它保存到單個節點時,它根本不會添加類型屬性。我還需要弄清楚在調用中添加額外模式的方法。我通過在soap-node核心代碼中手動添加它來解決這個問題,但那根本不是乾淨的(儘管如此我仍然可以)。

任何想法?我對SOAP相當陌生,目前我沒有太多運氣。

謝謝!

+0

我有同樣的問題,你如何修復它 –

回答

-1

夫婦的事情,我確信: 我包含在我的WSDL定義下列命名空間:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

此外,在響應確保你有以下的命名空間,信封:

xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

我必須在以下位置lib/wsdl.js中手動修復節點soap庫中的幾件事WSDL.prototype._xmlnsMap函數添加上面的命名空間

我添加以下代碼,使之成爲現實:

WSDL.prototype._xmlnsMap = function() { 
    var xmlns = this.definitions.xmlns; 
    var str = ''; 
    for (var alias in xmlns) { 
     if (alias === '' || alias === TNS_PREFIX) { 
     continue; 
     } 
     var ns = xmlns[alias]; 
     switch (ns) { 
     case "http://www.w3.org/2001/XMLSchema-instance" : //xsi support 
     case "http://www.w3.org/2001/XMLSchema" : //xsd support 
      str += ' xmlns:' + alias + '="' + ns + '"'; 
      continue; 
     case "http://xml.apache.org/xml-soap" : // apachesoap 
     case "http://schemas.xmlsoap.org/wsdl/" : // wsdl 
     case "http://schemas.xmlsoap.org/wsdl/soap/" : // wsdlsoap 
     case "http://schemas.xmlsoap.org/wsdl/soap12/": // wsdlsoap12 
     case "http://schemas.xmlsoap.org/soap/encoding/" : // soapenc 
      continue; 
     } 
     if (~ns.indexOf('http://schemas.xmlsoap.org/')) { 
     continue; 
     } 
     if (~ns.indexOf('http://www.w3.org/')) { 
     continue; 

     } 
     if (~ns.indexOf('http://xml.apache.org/')) { 
     continue; 
     } 
     str += ' xmlns:' + alias + '="' + ns + '"'; 
    } 
    return str; 
    }; 

更新的響應:

<soap:Body><IsAliveResponse><return xsi:type="xsd:string">success</return> 
</IsAliveResponse></soap:Body> 

這是我使用的服務文件的內容:

return:{ 
    attributes: { 
     'xsi:type': 'xsd:string' 
    }, 
    $value: healthCheck 
} 
相關問題