No.1 什么是WebService
?
WebService
技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。
依据WebService
规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。
WebService
就是一个应用程序向外界暴露出一个能通过Web
进行调用的API
,也就是说能用编程的方法通过Web
来调用这个应用程序
WebService
是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。
WebService
平台需要一套协议来实现分布式应用程序的创建。
WebService
是一种跨编程语言和跨操作系统平台的远程调用技术。
No.2 WebService
技术原理
XML
+XSD
,SOAP
和WSDL
就是构成WebService
平台的三大技术。
2.1、XML+XSD
WebService
采用HTTP
协议传输数据,采用XML
格式封装数据(即XML
中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。
XML
是WebService
平台中表示数据的格式。
XML
除了易于建立和易于分析外,其主要的优点在于它既是平台无关的,又是厂商无关的。
XML
解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。
XML
Schema
(XSD
)定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService
平台就是用XSD来作为其数据类型系统的。
2.2、SOAP
WebService
通过HTTP
协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML
格式封装,并增加了一些特定的HTTP
消息头,以说明HTTP
消息的内容格式,这些特定的HTTP
消息头和XML
内容格式就是SOAP
协议。
SOAP
提供了标准的RPC
方法来调用WebService
。
SOAP
协议 = HTTP
协议 + XML
数据格式
SOAP
协议定义了SOAP
消息的格式,SOAP
协议是基于HTTP
协议的,SOAP
也是基于XML
和XSD
的,XML
是SOAP
的数据编码方式。
2.3、WSDL
WebService
客户端要调用一个WebService
服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以WebService
务器端首先要通过一个WSDL
文件来说明自己提供哪些服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url
地址表示,服务通过什么方式来调用。
WSDL
(Web Services Description Language)是一个基于XML
的语言,用于描述WebService
及其函数、参数和返回值。它是WebService
客户端和服务器端都能理解的标准格式。
WSDL
文件保存在Web服务器上,通过一个url
地址就可以访问到它。
客户端要调用一个WebService
服务之前,要知道该服务的WSDL
文件的地址。
WebService
服务提供商可以通过两种方式来暴露它的WSDL
文件地址:
1.注册到UDDI
服务器,以便被人查找;
2.直接告诉给客户端调用者。
No.3 WebService
实现方式
WebService
的三种常用实现方式有:
RPC:远程过程调用方式(面向方法)
SOA:面向服务的方式(面向消息)
REST:Representational
state
transfer
表述性状态转移(面向资源)
3.1、Apache Axis2 技术
Axis2
是一套崭新的WebService
引擎,该版本是对Axis1.x
重新设计的产物。Axis2
不仅支持SOAP1.1
和SOAP1.2
,还集成了非常流行的REST
WebService
,同时还支持Spring
、JSON
等技术。
这些都将在后面的系列教程中讲解。在本文中主要介绍了如何使用Axis2
开发一个不需要任何配置文件的WebService
,并在客户端使用Java
和C#
调用这个WebService
。
3.2、Apache CXF框架
Apache CXF
是一个开源的Services
框架,CXF
帮助您来构建和开发Services
,这些Services
可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF
大大简化了Service
可以天然地和Spring
进行无缝集成。
CxF
是Celtrix
(ESB
框架)和XFire
(webserivice
) 合并而成,并且捐给了apache
。
CxF
的核心是org.apache.cxf.Bus
(总线),类似于Spring
的 ApplicationContext
。
CXF
默认是依赖于Spring
的。
Apache CXF
发行包中的jar
,如果全部放到lib
中,需要JDK1.6
及以上,否则会报JAX-WS
版本不一致的问题。
CXF
内置了Jetty
服务器,它是servlet
容器,好比tomcat
。
CXF特点
与Spring、Servlet
做了无缝对接,cxf
框架里面集成了Servlet
容器Jetty
支持注解的方式来发布WebService
能够显示一个WebService
的服务列表
能够添加拦截器:输入拦截器、输出拦截器:
输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器
CXF与Spring集成
建立一个web
项目。
准备所有jar
包,将CXF_HOMElib
项目下的所有jar
包,全部都拷贝新项目的lib
目录下.其中里面已经包含了Sring3.0
的jar
包,其中jetty
服务器的包可以不要,因为我们可以部署在tomcat
服务器中。
在web.xml
中配置cxf
的核心servlet,CXFServlet
此配置文件的作用类拦截/ws/*
的所有请求,类似Struts2
的过滤器。
@WebService 标记表示该接口是一个WebService
服务
@WebMethod 表示表示以下方法为WebService
服务中的方法,exclude=true
表示该方法不被发布出去
@WebParam 表示方法中的参数
示例程序:
新建一个maven工程
添加依赖
编写实体类
编写服务接口
编写服务接口实现类
编写spring的配置
编写web.xml的配置
浏览器访问
结果
出现如下结果,则表明服务发布成功。
3.3、Jersey
Jersey RESTful WebService
框架是一个开源的、产品级别的JAVA
框架,支持JAX-RS API
并且是一个JAX-RS
(JSR 311
和 JSR 339
)的参考实现。
Jersey
不仅仅是一个JAX-RS
的参考实现,Jersey
提供自己的API
,其API
继承自JAX-RS
,提供更多的特性和功能以进一步简化RESTful service
和客户端的开发。
@Path 用来为资源类或方法定义URI
,当然除了静态URI
也支持动态URI
@PathParam 用来将请求URI
的一部分作为方法参数传入方法中,对URI
的动态部分,可以自定义校验正则表达式,如果请求参数校验失败,容器返回404 Not Found
@GET 表明被注解的方法响应HTTP GET
请求,@POST
、@PUT
和@DELETE
同理
@Consumes 定义请求的媒体类型,如果不指定,则容器默认可接受任意媒体类型,容器负责确认被调用的方法可接受HTTP
请求的媒体类型,否则返回415 Unsupported Media Type
@Produces 定义响应媒体类型,如果不指定,则容器默认可接受任意媒体类型,容器负责确认被调用的方法可返回HTTP
请求可以接受媒体类型,否则返回406 Not Acceptable
@QueryParam 用来指定方法的参数。
@Context 将信息注入请求或响应相关的类,可注入的类有:Application
,UriInfo
,Request
,HttpHeaders
和SecurityContext
。
@Singleton 和 @PerRequest 默认情况下,资源类的生命周期是per-request
,也就是系统会为每个匹配资源类URI
的请求创建一个实例,这样的效率很低,可以对资源类使用@Singleton
注解,这样在应用范围内,只会创建资源类的一个实例
示例程序:
新建一个maven工程
添加依赖
编写对外服务类
编写一个测试启动类
在浏览器中访问:
服务端打印信息:
说明:
一般情况下,我们会建一个web
项目并在web.xml
文件中配置一个servlet
容器来处理请求,具体如下:
No.4 适用场景
1、跨防火墙通信
如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服 务器。在这种情况下,使用DCOM
就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是,选择用浏览器作为客户 端,写下一大堆ASP
页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。如果中间层组件换成WebService
的话, 就可以从用户界面直接调用中间层组件。从大多数人的经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用WebService
这种结构,可以节 省花在用户界面编程上20%的开发时间。
2、应用程序集成
企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常 需要从运行在IBM
主机上的程序中获取数据;或者把数据发送到主机或UNIX
应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集成起来。通过WebService
,可以很容易的集成不同结构的应用程序。
3、B2B集成
用WebService
集成应用程序,可以使公司内部的商务处理更加自动化。跨公司的商务交易集成通常叫做B2B
集成。WebService
是B2B
集成成功的关键。
通过WebService
,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,把电子下单系统和电子票系统“暴露”出来,客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购票。WebService
只是B2B
集成的一个关键部分,还需要许多其它的部分才能实现集成。
用WebService
来实现B2B
集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为WebService
,就可以让任何指定 的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B
集成上的时间和成本,让许多原本无法承受EDI
的中小企业也能实现B2B
集成。
4、软件和数据重用
软件重用是一个很大的主题,重用的形式很多,重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用,一种形式是二进制形式的组件重用。
采用WebService
应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用,达到业务级重用。
·end·