WebService简介
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。
简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。
- WebService:是一个独立的平台,具有低耦合和自包含的特性,是基于可编程的Web应用程序,可使用开放的SML标准描述、发布、发现、协调和配置相关应用程序,用于开发各种数据交换的应用程序或接口。
- WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。
- WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。
- XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
- SOAP:简单对象访问协议是交换数据的一种协议规范,是一种简单的轻量级协议规范,是基于XML标准的,用于在WEB上交换结构化和固化的信息。他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。
SOAP结构( SOAP=http+xml)
必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
- WSDL:网络服务描述语言是WebService的描述语言,它包含了一系列描述某个WebService的定义
- WSDD:是WebService中定制发布的XML描述文件,相对于即时发布更加繁琐和复杂,但具有更大的灵活性,因此是实际项目开发中的首选。
- UDDI:是一种目录服务,企业可以使用它对WebService进行注册和搜索。如果我们要使用一种服务,但是不知道地址(wsdl等),我们就可以在UDDI中查找。大部分情况下,我们都是知道服务地址的。
- CXF是一个开源的WebService框架。Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。
JAVA WebService规范
Java 中共有三种WebService 规范,分别是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。
(1)JAX-WS:
JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。
(2)JAXM&SAAJ:
JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是Java EE 的可选包,因此你需要单独下载。
SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*包。
JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使用JAXM&SAAJ。
(3)JAX-RS:
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。
核心技术:
- 发布技术
①WSDD
②UDDI
③JAX-WS - 解析技术
①XML解析技术:DOM4J、JDOM
②WSDL解析技术:WSDL4J - 调用技术
①JAX-WS
②AXISI.X、AXIS2.X、AXIOM
③XFIRE
④CXF:与AXIS系列jar冲突不能同时使用
客户端:WSDL4J自动生成WebService客户端 - 测试技术
①单元测试技术:JUnit
② 集成模拟测试技术:SOAP UI
JAR包:
名称 | 用途 | 名称 | 用途 |
---|---|---|---|
axis.jar | Axis引包 | cxf .jar | |
jaxrpc.jar | Axis 运行所需要的组件包 | jaxb-impl.jar | CXF引擎包 |
wsdl4j.jar | Axis运行所需要的组件包 | iaxb-xjc .jar | 使用CXF所需jar包 |
axiom-api.jar | Axis对象模型 | jettison.jar | 使用CXF所需jar包 |
axiom-impl.jar | Axis对象模型 | jra-1.0-alpha .jar | 使用CXF所需jar包 |
saaj-api.jar | 使用Axis所需jar包 | js-1.6R7.jar | 使用CXF所需jar包 |
saaj-impl.jar | 使用Axis所需jar包 | jsr311-api .jar | 使用CXF所需jar包 |
dom4j.jar | 解析XML | neethi .jar | 使用CXF所需jar包 |
jdom2.jar | 解析XML | opensaml.jar | 使用CXF所需jar包 |
jdom.jar | 解析XML | wss4j.jar | 创建CXF所需jar包 |
serializer.jar | XML序列化 | wstx-asl .jar | 创建CXF所需jar包 |
wsdl4j.jar | 用来解析服务的WSDL文件 | xfire-all .jar | xfire引擎包 |
FastInfoset.jar | 使用WebService所需jar包 | xbeans .jar | 使用xfire所需jar包 |
jaxb-api.jar | 使用WebService所需jar包 | XmlSchema.jar | 使用xfire所需jar包 |
saaj.jar | SOAP组件包 | soap.jar | SOAP引擎包 |
WebService入门案例
服务端的实现
1. 编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中就是普通接口
public interface WeatherInterface {
public String queryWeather(String cityName);
}
2. 编写SEI实现类,此类作为webservice提供服务类
@WebService //@WebService表示该类是一个服务类,需要发布其中的public的方法
public class WeatherInterfaceImpl implements WeatherInterface {
@Override
public String queryWeather(String cityName) {
System.out.println("获取城市名"+cityName);
String weather="暴雨";
return weather;
}
}
3. 第三步:发布服务,Endpoint类发布服务,publish方法,两个参数:1.服务地址;2.服务实现类
public class WeatherServer {
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
}
}
4. 测试服务是否发布成功,通过阅读wsdl,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功
//我们在浏览器输入 http://127.0.0.1:12345/weather?wsdl 来获取wsdl文件进行阅读
//wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.
客户端的实现
//客户端调用服务有很多种方法,我们先用工具生成客户端代码,后面会详解
//wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。
1.创建一个客户端空项目,cmd命令行进入此项目的src目录
使用以下命令生成客户端代码
wsimport -s . http://127.0.0.1:12345/weather?wsdl
-s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.
最后面的http….是指获取wsdl说明书的地址
2.编写客户端
public class WeatherClient {
public static void main(String[] args) {
//创建服务视图,视图是从wsdl文件的service标签的name属性获取
WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService();
//获取服务实现类,实现类从wsdl文件的portType的name属性获取
WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);
//获取查询方法,从portType的operation标签获取
String weather=weatherInterfaceImpl.queryWeather("北京");
System.out.println(weather);
}