Web Service 简介

Web Service 技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据 Web Service 规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。
Web Service 是一种跨编程语言和跨操作系统平台的远程调用技术。

详细信息: WebService百度百科

WebService 的原理

XML+XSD,SOAP 和 WSDL 就是构成 WebService 平台的三大技术
SOAP 协议 = HTTP 协议 + XML 数据格式

WebService 开发可以分为服务器端开发和客户端开发两个方面
对客户端而言,我们给这各类 WebService 客户端 API 传递 wsdl 文件的 url 地址,这些 API 就会创建出底层的代理类,我调用 这些代理,就可以访问到 webservice 服务。代理类把客户端的方法调用变成 soap 格式的请求数据再通过 HTTP 协议发出去,并把接收到的 soap 数据变成返回值返回。
对服务端而言,各类 WebService 框架的本质就是一个大大的 Servlet,当远程调用客户端给它通过 http 协议发送过来 soap 格式的请求数据时,它分析这个数据,就知道要调用哪个 java 类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成 soap 格式的数据,通过http响应消息回给客户端。

JAVA WebService 规范

Java 中共有三种 WebService 规范,分别是 JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。

Web Service 服务端开发

创建一个 WebService 实例,实现服务端发布,客户端获取信息的功能。
使用 idea 创建 springboot 项目,配置 WebService 和 web 依赖

1
2
3
4
1.编写 WebService 接口方法
public interface HelloWebService {
String sayHello(String name);
}

1
2
3
4
5
6
7
8
9
10
2.实现接口,作为 webservice 提供服务类 
@WebService
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String sayHello(String name) {
String said = name + ",Hello~~";
System.out.println(said);
return said;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3.发布服务
@SpringBootApplication
public class App {

public static void main(String[] args) {
SpringApplication.run(App.class, args);
/*
在服务器端运行 WebServicePublish 类中的 main 方法,控制台打印出发布 webservice 成功!
在浏览器中输入我们在 WebServicePublish 类中定义的 url?wsdl (注意一定要加 wsdl ),浏览器显示一个 xml 文档
那么我们这个 WebService 就发布成功了。
*/
//定义 webService 的发布地址,提供给外界使用接口的地址
String url = "http://localhost:8081/WebService";
Endpoint.publish(url,new HelloWebServiceImpl());
System.out.println("发布 webService 成功!");
}
}
1
4.浏览器输入 `http://localhost:8081/WebService?wsdl` 测试服务是否发布成功

Web Service 客户端实现

访问http://localhost:8081/WebService?wsdl,将文档下载保存为 wsdl 格式

idea 解析 wsdl 文件反向生成代码

用 idea 新建一个 java 项目,导入 wsdl 文件
wsdl 文件右键点击–> WebServices –> Generate Java Code From Wsdl –>选择解析规范 JAX-WS(idea自带)

1
2
3
4
5
6
7
8
9
10
11
12
编写客户端
public class HelloClient {
public static void main(String[] args) {
//创建服务视图,视图是从 wsdl 文件的 service 标签的 name 属性获取
HelloWebServiceImplService helloWebServiceImplService = new HelloWebServiceImplService();
//获取服务实现类,实现类从 wsdl 文件的 portType 的 name 属性获取
HelloWebServiceImpl helloWebService = helloWebServiceImplService.getPort(HelloWebServiceImpl.class);
//获取查询方法,从 portType的operation 标签获取
String str = helloWebService.sayHello("小明");
System.out.println(str);
}
}

直接执行,控制台成功输出