来自Javascript的SOAP网络服务调用

来自Javascript的SOAP网络服务调用

问题描述:

我正在努力成功地从网页上对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

我发现这里发生了什么事。这与本主题中的情况相同: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

您是否真的测试过ws工作正常?
您可以使用SoapUI检查请求/响应等。 当您确认ws在SoapUI上工作时,检查原始Soap消息的格式是什么。然后在使用.js方法发送之前尝试检查它的外观,并比较它们。

它可能会帮助你了解什么是错的。

+0

谢谢你的建议。 Web服务从soapUI正常工作。 我比较了soapUI发送的请求的内容与jqSOAPClient发送的请求的内容。 – bgh 2011-03-24 12:45:17

+0

请求如下: soapUI: ' 哈德 soapenv:身体> soapenv:信封>' jqSOAPClient: '哈德 soapenv:身体> soapenv:信封>' – 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

检查这有助于
http://bugs.jquery.com/attachment/ticket/6029/jquery-disable-firefox3-cross-domain-magic.patch

它标记为无效
http://bugs.jquery.com/ticket/6029
但它可能给你一些提示

在另一方面,而是覆盖了跨域脚本正确的设置可能会更好,如果你可以创建并调用本地页面,将请求ws并返回结果。
甚至更​​好,你可以创建页面,将接收网址作为参数,并请求该网址,只是返回结果。这样它会更通用和可重用。