使用JS、ajax访问WebService跨域

通过js来访问webservice有两种不同的形式
1、通过SOAP协议进行访问。
发送的全部是XML数据,且必须是POST请求。
2、通过HTTP的get/post方式进行访问。
此种情况又分成不同的形式,此种情况必要在cxf下发布。因为jdk1.6基本的发布不支持Http,soap1.2。

使用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请求" οnclick="sendMsg();">
	<input type="text" id="name">
	<div id="showInfo">
	</div>
     </body>
</html>

可以用ajax来书写,我这个异步加载时比较原始的方法。


  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值