我正在努力从网页成功地调用 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/