2011-03-24 34 views
8

我正在努力成功地從網頁上對SOAP Web服務進行Web服務調用。 Web服務是使用JAX-WS的Java Web服務。來自Javascript的SOAP網絡服務調用

這裏是Web方法,我試圖打電話:

@WebMethod 
public String sayHi(@WebParam(name="name") String name) 
{ 
    System.out.println("Hello "+name+"!"); 
    return "Hello "+name+"!"; 
} 

我試着做使用jQuery庫jqSOAPClient(http://plugins.jquery.com/project/jqSOAPClient)的Web服務調用。
下面是代碼,我用:

var processResponse = function(respObj) 
{ 
    alert("Response received: "+respObj); 
}; 

SOAPClient.Proxy = url; 
var body = new SOAPObject("sayHi"); 
body.ns = ns; 
body.appendChild(new SOAPObject("name").val("Bernhard")); 

var sr = new SOAPRequest(ns+"sayHi",body); 
SOAPClient.SendRequest(sr,processResponse); 

無響應似乎回來了。當我在jqSOAPClient.js中登錄xData.responseXML數據成員時,我得到'undefined'。在Web服務,我看到警告2011年3月

24上午十時49分51秒com.sun.xml.ws.transport.http.server.WSHttpHandler handleExchange 警告:不能處理HTTP方法:OPTIONS

我也試過使用JavaScript庫soapclient.js(http://www.codeproject.com/kb/Ajax/JavaScriptSOAPClient.aspx)。我在這裏使用的客戶端代碼是

var processResponse = function(respObj) 
{ 
    alert("Response received: "+respObj); 
}; 

var paramaters = new SOAPClientParameters(); 
paramaters.add("name","Bernhard"); 
SOAPClient.invoke(url,"sayHi",paramaters,true,processResponse); 

我繞過部分,其獲取的WSDL soapclient.js,因爲它不工作 (我得到一個:IOException: An established connection was aborted by the software in your host machine在Web服務端) 。 WSDL只是檢索適當的名稱空間才能使用,所以我剛剛用實際名稱空間替換了變量ns。

我得到了和以前一樣的web服務警告(無法處理HTTP方法:OPTIONS),並且在瀏覽器的錯誤控制檯中出現錯誤「document is null」。當我在soapclient.js中記錄req.responseXML的值時,我發現它是空的。

任何人都可以建議什麼可能會出錯,我應該怎麼做才能使它工作?

+0

當我將Web服務部署到Glassfish時,客戶端獲得相同的響應(對於jqSOAPClient.js,爲「undefined」,在使用soapclient.js時爲null)。 – bgh 2011-03-24 11:11:28

回答

2

我發現這裏發生了什麼事。這與本主題中的情況相同:jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox

基本上我使用Firefox,當使用AJAX從Firefox進行跨域調用(web服務的地址域與網頁的域不同)時,Firefox首先發送一個OPTIONS HTTP消息(在傳送POST消息之前),從Web服務中確定是否允許該呼叫。 Web服務必須響應這個OPTIONS消息來判斷它是否允許請求通過。

現在,來自JAX-WS的警告(「無法處理HTTP方法:OPTIONS」)表明它不會處理任何OPTIONS HTTP消息。沒關係 - Web服務最終將在Glassfish上運行。 現在的問題是我如何配置Glassfish來響應OPTIONS消息。

在上面尤哈引用的線程說,他使用在Django以下代碼:

def send_data(request): 
    if request.method == "OPTIONS": 
     response = HttpResponse() 
     response['Access-Control-Allow-Origin'] = '*' 
     response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
     response['Access-Control-Max-Age'] = 1000 
     response['Access-Control-Allow-Headers'] = '*' 
     return response 
    if request.method == "POST": 
     # ... 

訪問控制允許來源給出了指示哪個起源(收件人地址)將被接受的模式(礦可能比簡單地允許任何來源更嚴格)並且Access-Control-Max-Age告訴客戶端將在多少秒後再次請求許可。

如何在Glassfish中執行此操作?

+0

呃,幫忙?任何人? – bgh 2011-03-29 09:41:21

+0

我決定通過在託管該網站的服務器上運行代理PHP Web服務來避免跨域Web服務調用。 Javascript調用此PHP Web服務,PHP腳本將請求轉發給目標Web服務。 – bgh 2011-04-06 13:11:09

1

您是否真的測試過ws工作正常?
您可以使用SoapUI檢查請求/響應等。 當您確認ws在SoapUI上工作時,檢查原始Soap消息的格式是什麼。然後在使用.js方法發送之前嘗試檢查它的外觀,並比較它們。

它可能會幫助你瞭解什麼是錯的。

+0

謝謝你的建議。 Web服務從soapUI正常工作。 我比較了soapUI發送的請求的內容與jqSOAPClient發送的請求的內容。 – bgh 2011-03-24 12:45:17

+0

請求如下: soapUI: ' 哈德 ' jqSOAPClient: ' 哈德 ' – bgh 2011-03-24 12:45:48

+0

有微小的差異,但我相信他們」都是正確的。我已經接受soapUI發送並將其硬編碼到jqSOAPClient.js中的請求,以便它發送完全該字符串,但web服務仍然會發出警告。com.sun.xml 2011年3月24日下午2時36分32秒.ws.transport.http.server.WSHttpHandler handleExchange 警告:無法處理HTTP方法:OPTIONS' 並且沒有響應。 當我使用soapUI時,web方法會執行,但從網頁調用時並不會運行。 – bgh 2011-03-24 12:47:18

0

檢查這有助於
http://bugs.jquery.com/attachment/ticket/6029/jquery-disable-firefox3-cross-domain-magic.patch

它標記爲無效
http://bugs.jquery.com/ticket/6029
但它可能給你一些提示

在另一方面,而是覆蓋了跨域腳本正確的設置可能會更好,如果你可以創建並調用本地頁面,將請求ws並返回結果。
甚至更​​好,你可以創建頁面,將接收網址作爲參數,並請求該網址,只是返回結果。這樣它會更通用和可重用。