簡體   English   中英

來自Javascript的SOAP Web服務調用

[英]SOAP web service calls from Javascript

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

這是我要調用的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數據成員,但未定義。 在Web服務中,我看到警告

2011年3月24日,上午10:49:51 com.sun.xml.ws.transport.http.server.WSHttpHandler handleExchange警告:無法處理HTTP方法:選項

我也嘗試使用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);

因為它不起作用,所以我繞過了soapclient.js中獲取WSDL的部分(我得到了: IOException: An established connection was aborted by the software in your host machine Web服務端IOException: An established connection was aborted by the software in your host machine上的IOException: An established connection was aborted by the software in your host machine )。 僅為使用的適當名稱空間檢索WSDL,因此我僅將變量ns替換為實際的名稱空間。

我在Web服務上收到與以前完全相同的警告(無法處理HTTP方法:OPTIONS),並且在瀏覽器的錯誤控制台中收到錯誤“文檔為空”。 當我在soapclient.js中記錄req.responseXML的值時,我看到它為空。

任何人都可以就可能出什么問題以及如何使它正常工作提出建議嗎?

我發現這里發生了什么。 這與該線程中的場景相同: jQuery $ .ajax(),$ .post在Firefox中以REQUEST_METHOD的形式發送“ OPTIONS”

基本上,我使用的是Firefox,當使用AJAX從Firefox進行跨域調用(Web服務的地址域與網頁的域不同)時,Firefox首先發送OPTIONS HTTP消息(在它發送POST消息之前),從Web服務確定是否應允許該呼叫。 然后,Web服務必須響應此OPTIONS消息,以告知其是否允許請求通過。

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

在上面引用的線程中,Juha說他在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-Allow-Origin提供了一個模式,該模式指示將接受哪些來源(收件人地址)(我的可能比僅允許任何來源更嚴格),並且Access-Control-Max-Age在幾秒鍾后告訴客戶端將不得不再次請求許可。

如何在Glassfish中做到這一點?

您是否已經實際測試過ws正常工作?
您可以使用SoapUI檢查請求/響應等。當您確認ws正在SoapUI中工作時,請檢查原始Soap消息的格式是什么。 然后嘗試檢查外觀,然后再使用.js方法發送並進行比較。

它可以幫助您了解問題所在。

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

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

另一方面,如果您可以創建並調用將向ws請求並返回結果的本地頁面,則覆蓋跨域腳本的正確設置可能更好。
甚至更好的是,您可以創建一個頁面,該頁面將接收url作為參數,並請求該url並僅返回結果。 這樣,它將更加通用和可重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM