一、WebService的介绍
Web Service是一种跨编程语言和跨操作系统平台的远程调用技术。Web Services 平台是 XML + HTTP。HTTP 协议是最常用的因特网协议。XML 提供了一种可用于不同的平台和编程语言之间的语言。web service的三个关键元素1、SOAP (简易对象访问协议), 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。用于访问网络服务的协议。2、UDDI (通用描述、发现及整合),UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。3、WSDL (Web services 描述语言),是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。
二、WebService适用场景
(1)跨防火墙通信
如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服 务器。在这种情况下,使用DCOM就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是,选择用浏览器作为客户 端,写下一大堆ASP页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。如果中间层组件换成WebService的话, 就可以从用户界面直接调用中间层组件。从大多数人的经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用WebService这种结构,可以节 省花在用户界面编程上20%的开发时间。
(2)应用程序集成
企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常 需要从运行在IBM主机上的程序中获取数据;或者把数据发送到主机或UNIX应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集 成起来。通过WebService,可以很容易的集成不同结构的应用程序。
(3)B2B集成
用WebService集成应用程序,可以使公司内部的商务处理更加自动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。WebService是B2B集成成功的关键。通过WebService,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,把电子下单系统和电子发票系统“暴露”出来,客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购发票。当然,这并不是一个 新的概念,EDI(电子文档交换)早就是这样了。但是,WebService的实现要比EDI简单得多,而且WebService运行在Internet 上,在世界任何地方都可轻易实现,其运行成本就相对较低。不过,WebService并不像EDI那样,是文档交换或B2B集成的完整解决方案。 WebService只是B2B集成的一个关键部分,还需要许多其它的部分才能实现集成。
用WebService来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为WebService,就可以让任何指定 的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本,让许多原本无法承受 EDI的中小企业也能实现B2B集成。
(4)软件和数据重用
软件重用是一个很大的主题,重用的形式很多,重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用,一种形式是二进制形式的组件重用。采用 WebService应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用,达到业务级重用。
三、WebService的常用框架
1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。
2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。
3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。
4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。
如果需要多语言的支持,选择AXIS2。如果需要实现侧重JAVA并希望和Spring集成,CXF就是更好的选择,特别是把你的Web Service嵌入其他的程序中。
四、WebService+Spring(cxf)
(1)服务端
1、配置文件
a、.web.xml文件中配置CXFServlet
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
b、在applicationContext-services.xml文件中配置webservice
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:server id="HZWQService" serviceClass="com.topscomm.webservice.service.IHuWaiAmiInterface" address="/hzwq">
<jaxws:serviceBean>
<ref bean="huWaiAmiInterface"/>
</jaxws:serviceBean>
</jaxws:server>
c、接口函数的配置
在要发布的类上加上@WebService的注解
对于该类中的非静态函数默认都会被发布出来
在每个函数的参数上可以添加一些注解,便于可以在生成的wsdl中了解每一个函数的参数是什么含义。
还有其他的一些常用注解http://yufenfei.iteye.com/blog/1685249
d、按照上述的配置结束后,启动项目就可以在浏览器中访问到ws生成的wsdl
访问路径为:项目的访问路径/web.xml中配置的url-pattern/address的配置名?wsdl
示例项目的访问路径http://127.0.0.1:8080/tcmr-hzwq/webservice/hzwq?wsdl
当可以看到如下的界面时就证明webservice服务端发布成功了。
(2)客户端
1、通过wsdl文件生成客户端代码
(1)方法一:使用jdk的wsimport生成
wsimport -keep -d D:\temp\d -s D:\temp\s -p com.map -verbose wsdl的文件路径
常用的几个关键字含义(也可以输入wsimport -help查看)
-keep:是否生成java源文件
-d:指定.class文件的输出目录
-s:指定.java文件的输出目录
-p:定义生成类的包名,不定义的话有默认包名
-verbose:在控制台显示输出信息
-b:指定jaxws/jaxb绑定文件或额外的schemas
-extension:使用扩展来支持SOAP1.2
(2)方法二:使用myeclipse生成
a.在项目上右键选择new-->web service client,然后选择要生成的framework
b.next
c.点击finsh即可,可以在选择的包下生成客户端的代码
2、在spring中配置ws的客户端
在spring的配置文件中将客户端进行配置
serviceClass:指的就是刚才生成代码中各个接口的定义的那个接口类
address:指的是访问ws服务端的路径
3、配置结束后就和正常的service层开发类似。
五、测试工具SoapUI
soapUI是一款用来进行检查、调用、实现Web Service的功能/负载/符合性测试的工具,该工具还可以进行很多关于webservice的测试。
1、客户端的模拟工具
a、在soapUI中新建soap项目
b、创建结束后,左侧目录中会展示将所有的接口
选择需要测试的接口,双击打开该接口的工作窗口。
c.如下图几位该试验的工作窗口,左侧为请求参数区,右侧为响应参数区
参数需要写在<![CDATA[...]]>中,不然会解析出错。
2、服务端的模拟工具
a.按照客户端的方式生成项目,然后如图选择soap mock service
b、选择要生成测试的接口即可。
c、然后mock测试的项目,如图选择设置图标,配置好该服务的访问路径,名称,端口等信息
d、和客户端操作相同,选择某个接口,然后即可通过程序对该服务进行访问,进行ws客户端的测试。
参考文档:
http://www.w3school.com.cn/webservices/index.asp
https://www.cnblogs.com/xiaohouzai/p/7282811.html
https://www.cnblogs.com/zhuyiqizhi/p/6045638.html
https://www.cnblogs.com/bigbang92/p/webservice_cxf_spring.html