2008-10-16 37 views

回答

17

您可以使用JavaScript本地使用XmlHttpRequest對象來使用Web服務。但是,在瀏覽器之間實例化此對象。例如,Firefox和IE 7 +可讓您將其實例化爲本機JavaScript對象,但IE6要求您將其實例化爲ActiveX控件。

因此,我建議使用抽象庫,如jQuery。如果這不是一個選項,那麼將創建抽象爲工廠方法並檢查瀏覽器版本。

要使用它來創建Web服務調用,只需實例化對象,然後調用它的open()方法。我建議這樣做是異步的,以保持UI的響應。當調用異步時,您將獲得指定的異步方法的回調,該方法將指示請求的狀態。當狀態爲4(加載)時,您可以獲取響應數據,然後對其進行處理。

如何處理數據將取決於它是什麼,如果它是JSON,那麼您可以通過JavaScript的eval()方法運行它,但這確實有一些安全隱患。如果它是XML,則可以使用XML DOM來處理它。

有關XMLHttpRequest對象的更多信息,請參閱Wikipedia

2

您可以使用XMLHttpRequest對象,但由於您不想使用任何JavaScript框架,因此您必須自己封送和解組SOAP封套。

+1

如果SOAP信封是SOAP Web服務,則只需要擔心SOAP信封。可以調用一些寧靜的Web服務,並且在沒有任何預處理的情況下讀取結果。 – brien 2008-10-16 10:46:12

5

如果服務託管在您的域中,您可以創建XMLHttpRequest。如果沒有,您將會遇到跨域問題。

+0

s/could/will /如果我沒有弄錯。 – 2008-10-16 10:45:31

+0

是的,你說得對。任何時候跨域的東西出現,我都不確定確切的規則是什麼。我只是儘量避免這些問題;) – brien 2008-10-16 10:46:57

+0

你是什麼意思,具體來說,「跨域問題」? – 2012-09-09 04:10:21

0

有一個用JavaScript編寫的小型庫,可以用作XML-SOAP客戶端。 我不知道它是否適用於所有瀏覽器,但它可能會幫助你。你可以找到它here

0

這工作。這是舊的(檢查Netscape),是在所有Ajax工具出來之前編寫的。你必須處理不同的瀏覽器 - 基本上,IE做到這一點,而其他人都是這樣做的。

// javascript global variables 
var soapHeader = '<?xml version=\"1.0\"?>' 
       + '<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"' 
       + ' SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"' 
       + ' xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\"' 
       + ' xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"' 
       + '>' 
       + '<SOAP-ENV:Header/>' 
       + '<SOAP-ENV:Body>'; 

var soapFooter = '</SOAP-ENV:Body>' 
       + '</SOAP-ENV:Envelope>'; 

var destinationURI = '/webservices/websalm'; 

var actionURI = ''; 

function callWebService(nsCallback,ieCallback,parms) { 
    try 
    { 
     // Create XmlHttpRequest obj for current browser = Netscape or IE 
     if (navigator.userAgent.indexOf('Netscape') != -1) 
     { 
      SOAPObject = new XMLHttpRequest(); 
      SOAPObject.onload = nsCallback; 
     } else { //IE 
      SOAPObject = new ActiveXObject('Microsoft.XMLHTTP'); 
      SOAPObject.onreadystatechange = ieCallback; 
     } 

     SOAPObject.open('POST', destinationURI, true); 

     // Set 2 Request headers, based on browser 
     if (actionURI == '') { 
      SOAPObject.setRequestHeader('SOAPAction', '\"\"'); 
     } else { SOAPObject.setRequestHeader('SOAPAction', actionURI); 
     } 

     SOAPObject.setRequestHeader('Content-Type', 'text/xml'); 

     // Compose the Request body from input parameter + global variables 
     var requestBody = soapHeader + parms + soapFooter 

     // Send, based on browser 
     if (navigator.userAgent.indexOf('Netscape') != -1) 
     { 
     SOAPObject.send(new DOMParser().parseFromString(requestBody,'text/xml')); 
     } else { 
     SOAPObject.send(requestBody); 
     } 
    } catch (E) 
    { 
    alert('callWebService exception: ' + E); 
    } 
}