java - 来自 Javascript 的 SOAP Web 服务调用

标签 java javascript jquery soap jax-ws

我正在努力从网页成功地调用 SOAP 网络服务。 Web 服务是使用 JAX-WS 的 Java 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 数据成员时,我得到“未定义”。在网络服务中我看到了警告

24 Mar 2011 10:49:51 AM com.sun.xml.ws.transport.http.server.WSHttpHandler handleExchange WARNING: Cannot handle HTTP method: 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);

我绕过了 soapclient.js 中获取 WSDL 的部分,因为它不起作用 (我得到一个:IOException:已建立的连接被您主机中的软件中止 在 Web 服务端)。仅为要使用的适当 namespace 检索 WSDL,因此我只是将变量 ns 替换为实际的 namespace 。

我在 Web 服务上收到与以前完全相同的警告(无法处理 HTTP 方法:OPTIONS),在浏览器的错误控制台中我收到错误“文档为空”。当我在 soapclient.js 中记录 req.responseXML 的值时,我发现它为空。

谁能告诉我可能出了什么问题,我应该怎么做才能让它发挥作用?

最佳答案

我发现这里发生了什么。这与此线程中的场景相同:jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox .

基本上我使用的是 Firefox,当一个人使用 AJAX 从 Firefox 进行跨域调用(网络服务地址的域与网页的域不同)时,Firefox 首先发送一个 OPTIONS HTTP -message(在传输 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 中执行此操作?

关于java - 来自 Javascript 的 SOAP Web 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5417014/

相关文章:

java - 需要在java中将XML转换为HTML

java - 使用 CGLib 拦截 JDK 类的包私有(private)方法

java - 为什么 float 用 1 除以 2 或 4 时返回 0?

javascript - 等待深度函数调用的深度异步等待结果?

javascript - 屏蔽电话号码,鼠标悬停时显示完整电话号码

java - 如何修复它才能捕获提到的 URL 格式?

javascript - 如何清除函数中设置的 javascript 超时

javascript - 对象 JS 中的 groupBy

jquery插件返回值

jquery - 使用返回的 JSON 填充数据库表