来自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的值时,我发现它是空的。
任何人都可以建议什么可能会出错,我应该怎么做才能使它工作?
我发现这里发生了什么事。这与本主题中的情况相同: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中执行此操作?
您是否真的测试过ws工作正常?
您可以使用SoapUI检查请求/响应等。 当您确认ws在SoapUI上工作时,检查原始Soap消息的格式是什么。然后在使用.js方法发送之前尝试检查它的外观,并比较它们。
它可能会帮助你了解什么是错的。
谢谢你的建议。 Web服务从soapUI正常工作。 我比较了soapUI发送的请求的内容与jqSOAPClient发送的请求的内容。 – bgh 2011-03-24 12:45:17
请求如下: soapUI: '
有微小的差异,但我相信他们”都是正确的。我已经接受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并返回结果。
甚至更好,你可以创建页面,将接收网址作为参数,并请求该网址,只是返回结果。这样它会更通用和可重用。
当我将Web服务部署到Glassfish时,客户端获得相同的响应(对于jqSOAPClient.js,为“undefined”,在使用soapclient.js时为null)。 – bgh 2011-03-24 11:11:28