Jquery aJax 跨域访问基于SOAP协议的WebService接口

47次阅读

共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。

一、概念
同源策略
浏览器出于安全考虑禁止 js 操作非本域下的 DOM 对象同时也禁止 XmlHttpRequest 向非本域的服务器发送 http 请求。只要协议、域名、端口有任意一个不同就被认为是不同域,之间的 js 操作和 XHR 请求就是跨域操作
SOAP
全名:simple object access protol, 简易对象访问协议,与 RPC 一样都是基于 HTTP 的请求响应模式的远程调用协议,通过 XML 协议传输数据。
WebService:
是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用 java 编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行
二、Demo
新建 WebService 项目

ctrl+ n 新建 Dynamic Web Project, 项目结构如下

HelloService 代码如下:
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class HelloService {

@WebMethod
public String say(String name) {
System.out.println(“———–“+name);
return”hello “+name;
}

}

选中刚刚创建的 Web 项目,新建 web Service 项目:

start Server 成功之后点击 finish,一个 webService 接口创建成功且已发布。现在在项目根目录会有一个 wsdl 文件夹可以找到一个 HellService.wsdl 文件,这个文件就是 wevservice 接口的描述文件。这个文件中 <wsdlsoap:address> 标签下 location 的值就是我们本次发布的服务对外暴露的地址;在这个地址后加?wsdl,浏览器中访问既可以查看到该文件。说明我们的服务发布成功。

跨域请求

任意位置创建一个 index.html,用 jquery ajax 的方式去访问刚刚暴露的那个接口
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<title>Insert title here</title>
<script type=”text/javascript” src=”jquery-3.3.1.min.js”></script>
<script type=”text/javascript”>
function test() {
var paramsXml = ‘<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:q0=”http://test.dgq.com” xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchemainstance”> <soapenv:Body> <q0:say> <q0:name>we</q0:name> </q0:say> </soapenv:Body> </soapenv:Envelope>’;
$.ajax({
url : “http://localhost:8080/WebSeviceTest/services/HelloService”,
type : “POST”,
dataType : “XML”,
contentType : “text/xml; charset=UTF-8”,
data : paramsXml,
crossDomain: true,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader(“SOAPAction”, “”);
},
success : function(data) {
console.log(data);
},
error : function(data) {
console.log(data);
}
});
}
</script>
</head>
<body>
<input type=”button” onclick=”test()” value =” 发送请求 ”>
</body>
</html>

contenType 必须是 text/xml

crossDomain: true,jqueryajax 的跨域配置

beforeSend 设置 SOAPAction 请求头,这是 axis1.x 版本的问题,要求必须要有 SOAPAction 请求头,即使值是空串,否则后台会报 no SOAPAction header

data : paramsXml 这是重点,paramsXml 就是我们本次访问的核心,paramsXml 中不仅有我们向后传递的参数也有我们要访问后台方法的描述,paramsXml 的值可以通过右键点击 wsdl 文件在 web Services 小 menu 中找到 test with web Service Explorer 选项打开 Web Services Explorer: 找到

正文完
 0