使用AJAX跨域访问WebService-之基于SOAP的xml数据:
JS一直存在跨域访问的问题。
目前的jQuery不支持跨域访问。如果要进行访问必须使用jQuery的jsonp数据形式。但原始的ajax可以通过get/post方式跨域访问http上的资源。以下是通过jax发布webservice。并通过js实现访问webService.
第一步:书写一个webService,通过Endpoint端点服务发布。
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.Endpoint; //1、表示这是一个web服务 @WebService public class HelloService { /** * 1、至少保证一个可以对外公开的服务 * 对外提供服务无非就是提供个方法给外部调用,如果一个服务类没有方法,那发布它是没有意义的 */ public String sayHello(@WebParam(name="name") String name){ System.out.println("sayHello()..."+name); return "hello " + name; } public static void main(String[] args) { /** * Endpoint 服务端点类,利用该类来发布服务 * 参数1:服务的发布地址 * 参数2:服务的实现者 * * publish发布成功后,会启动一个新线程来监听对 http://ip地址/hello 这个地址的请求 */ Endpoint.publish("http://192.168.1.109:8080/hello", new HelloService()); //接着就可以查看wsdl了浏览器中打开:http://172.16.35.55:8080/hello?wsdl //如果正常返回就说明发布成功 so easy! //问个多线程问题....以下输出语句能执行吗? System.out.println("web服务已经启动..."); //注意:必须至少要有一个公共方法,否则发布异常. 静态方法,和final修饰的方法不会被发布 } }
第二步:书写XMLHttpRequest的ajax对像,设法获取请求webService的XML数据和WebService返回的数据,以便于数据解析。
<html> <head> <title>通过ajax调用WebService服务</title> <script> var xhr = new ActiveXObject("Microsoft.XMLHTTP"); function sendMsg(){ var name = document.getElementById('name').value; //服务的地址 var wsUrl = 'http://192.168.1.102:8080/hello'; //请求体 var soap = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ws.luowg.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' + ' <soapenv:Body> <q0:sayHello><name>'+name+'</name> </q0:sayHello> </soapenv:Body> </soapenv:Envelope>'; //打开连接 xhr.open('POST',wsUrl,true); //重新设置请求头 xhr.setRequestHeader("Content-Type","text/xml;charset=UTF-8"); //设置回调函数 xhr.onreadystatechange = _back; //发送请求 xhr.send(soap); } function _back(){ if(xhr.readyState == 4){ if(xhr.status == 200){ //alert('调用Webservice成功了'); var ret = xhr.responseXML; var msg = ret.getElementsByTagName('return')[0]; document.getElementById('showInfo').innerHTML = msg.text; //alert(msg.text); } } } </script> </head> <body> <input type="button" value="发送SOAP请求" onclick="sendMsg();"> <input type="text" id="name"> <div id="showInfo"> </div> </body> </html>
可以用ajax来书写,我这个异步加载时比较原始的方法。