2015-04-01 164 views
2

我正在用JS創建一個SOAP客戶端,這是我第一次使用web服務,並且我的代碼中必須有幾個錯誤。創建一個JavaScript SOAP客戶端

poit是,用我的代碼,我無法訪問到WebService,但我不知道如何訪問裏面的方法。所以web服務給我以下的迴應:

<h1>Version</h1> 
<p>Hi there, this is an AXIS service!</p> 
<i>Perhaps there will be a form for invoking the service here...</i> 

而不是正在調用的方法正確的XML。

這是我的SOAP客戶端的代碼:

<html> 

<script type="text/javascript"> 

    function run(){ 

     var objXMLHttpRequest = new XMLHttpRequest(); 
     objXMLHttpRequest.open("GET", "http://localhost:8080/CrunchifyWS/services/Version?wdsl/", true); 
     objXMLHttpRequest.onreadystatechange = function() { 
     //alert(objXMLHttpRequest.readyState+" "+ objXMLHttpRequest.status); 
     if (objXMLHttpRequest.readyState == 4 && objXMLHttpRequest.status == 200) { 
      result = objXMLHttpRequest.responseXML; 
      alert(objXMLHttpRequest.responseText); 
      alert(objXMLHttpRequest.responseXML); 
      } 
     } 
     objXMLHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); 

     var packet = '<?xml version="1.0" encoding="utf-8" ?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><getVersion xmlns="http://service.web.com.crunchify/"></getVersion></soap:Body></soap:Envelope>'; 

     objXMLHttpRequest.send(packet); 
     // Add mentioned below code only if your application calls webservice synchronously. Otherwise use "onreadystatechange" process response. 
     response = objXMLHttpRequest.responseXML; 
     alert(objXMLHttpRequest.responseText+ " "+ response); 
    } 
</script> 

<head> 
</head> 
<body> 
    <button onclick="run()">Dale!</button> 
</body> 
</html> 

我認爲TE的錯誤應該是在部分,但是,正如我所說,這是我第一次,我不知道我正在做。

解決

+0

我對角讀取,但嘗試「POST」而不是「GET」?大多數肥皂終點是僅郵政。 – nablex 2015-04-01 10:05:11

+0

當嘗試POST而不是GET我有 <?xml version =「1.0」encoding =「UTF-8」?> NS1:Client.NoSOAPAction 沒有SOAPAction頭 WebServices-PC LokiNkc 2015-04-01 10:12:19

+0

是的,在SOAP 1.1版本中,您需要添加一個soapaction。這個soapaction可以從WSDL中獲取,並且必須作爲HTTP頭傳入。 – nablex 2015-04-01 10:15:47

回答

0

的第一個問題可能是在這條線:

objXMLHttpRequest.open("GET", "http://localhost:8080/CrunchifyWS/services/Version?wdsl/", true); 

這個網址 http://localhost:8080/CrunchifyWS/services/Version?wsdl 給你,你可以調用服務的列表。

所以你可能有這樣的事情:

objXMLHttpRequest.open("GET", "http://localhost:8080/CrunchifyWS/services/myServiceMethod", true); 

這是第一個問題,我想。 第二次,你必須發送你的參數,但不是整個Soap信封。

var packet = '<?xml version="1.0" encoding="utf-8" ?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><getVersion xmlns="http://service.web.com.crunchify/"></getVersion></soap:Body></soap:Envelope>'; 

objXMLHttpRequest.send(packet); 

喜歡:

var parameters = "param1=15&param2=30" 
objXMLHttpRequest.send(parameters); 

,並且該方法的發送應該出的 objXMLHttpRequest.onreadystatechange =函數(){}

此函數是一個回調審查響應。

不要猶豫,看看這個鏈接: http://www.w3schools.com/xml/xml_dtd.asp

希望這有助於

+0

事情是這個方法沒有參數。 這是WS的wdsl:http://pastebin.com/3QejHfqz 我真的不知道我必須這樣做:( – LokiNkc 2015-04-01 09:57:15

0

您可以查看評論的答案的發展,但在短期:

1)SOAP方法調用需要使用HTTP方法「POST」,所以GET操作是第一個問題。

2)在SOAP 1.1中,服務器需要SOAPAction頭以知道您嘗試調用哪種方法。當使用「文檔文字包裝」方法時,這並不是嚴格必要的,許多SOAP 1.1服務器實際上接受空soap操作,因爲它們可以根據請求的根標籤找到方法,因此提供了與SOAP 1.2的一些前向兼容性。

但是嚴格的SOAP 1。1個服務器將需要SOAPAction頭沿着正確發送:

objXMLHttpRequest.setRequestHeader("SOAPAction", "mySoapAction"); 

哪裏可以找到您試圖在Web服務的原始WSDL調用的方法相應的SOAPAction。