来自Javascript的SOAP Web服务调用

bgh*_*bgh 8 javascript java jquery soap jax-ws

我正在努力成功地从网页上调用SOAP Web服务.Web服务是使用JAX-WS的Java Web服务.

这是我试图调用的Web方法:

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

我尝试使用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);
Run Code Online (Sandbox Code Playgroud)

似乎没有回应.在jqSOAPClient.js我记录xData.responseXML数据成员时,我得到'undefined'.在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);
Run Code Online (Sandbox Code Playgroud)

我绕过了soapclient.js中获取WSDL的部分,因为它不起作用(我得到了: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的值时,我看到它为null.

任何人都可以建议可能出现的问题以及我应该采取什么措施来实现这一目标?

bgh*_*bgh 2

我知道这里发生了什么事。这与此线程中的情况相同:jQuery $.ajax(), $.post 在 Firefox 中发送“OPTIONS”作为 REQUEST_METHOD

基本上我使用的是 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":  
        # ... 
Run Code Online (Sandbox Code Playgroud)

Access-Control-Allow-Origin 给出了一个模式,指示将接受哪些来源(收件人地址)(我的可能比简单地允许任何来源更严格),并且 Access-Control-Max-Age 告诉客户端在多少秒后将不得不再次请求许可。

我如何在 Glassfish 中执行此操作?