一、webservice相关术语
1、SOA
Web服务建立于Service-Oriented Architecture(面向服务的体系结构,简写SOA)基础之上,SOA是最新的分布式计算技术。
2、SOAP消息
Simple Object Access Protocol(简单对象访问协议)
SOAP与其它分布式对象协议最为主要的区别在于它是基于XML的(传统的IIOP(CORBA)或JRMP(RMI)协议是基于二时进制的)。SOAP有自己的XML Schema定义,并大量依赖于用户自定义XML Schema。每一条经网络被送出的SOAP消息,都包含了标准SOAP元素与应用数据的XML文档。SOAP用作在HTTP、SMTP、FTP等 Internet协议之上使用绑定进行传送的消息交换协议。SOAP提供传输数据的标准方式,充当在服务提供方和服务请求方之间激活服务的消息交换服务
3、WSDL
Web Service Definition Language(web服务定义语言)
是一种用来描述web service及其访问信息的XML文档,它与编程语言、平台和协议无关。WSDL的协议无关性意味着,它可以用于描述任何类型的web service,而不仅仅是基于HTTP的SOAP类型,它包含web服务4个方面的重要信息
4、UDDI
Universal Description,Discovery and Integation(通用描述、发现和集成)
它定义了在互联网上发布和寻找web service的标准.与XML、SOAP、WSDL不同,它并非web service的基础。但是在Java EE中,它被认为是web service的一个基本要素。web服务代理方将UDDI用作注册web服务提供方的标准,而服务请求方则通过UDDI注册表通信来查找并调用服务。可UDDI可以实现为公共注册表,以支持全球的团体,也可实现为私有的注册表
实现web服务的操作步骤
(1)web服务提供方创建SOAP代理接口和基于WSDL的服务描述
(2)web服务提供方注册/发布服务
(3)web服务代理方(通常是一个UDDI注册表)将服务描述存储为绑定模块或URL
(4)web服务请求方从UDDI注册表查找服务及绑定信息
(5)web服务请求方激活并获得WSDL
(6)双方使用SOAP RPC或SOAP Messaging交换机制来交换数据
Web service的出现为真正意义上的跨越硬件(设备)、操作系统(平台)、编程语言和应用系统的互操作能力提供了可能。
二、运行环境
Axis2的下载和安装在Axis2下载与安装中已介绍,点击打开链接。
三、开发及发布webservice
在Axis2中可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。
首先编写Service类,代码如下:
在命令行通过javac命令编译Service类生成Service.class文件。将Service.class文件放到%TomcatHome%\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录)。现在我们已经成功将Service类发布成了webservice。在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/services/listServices
这时当前页面将显示所有在Axis2中发布的webservice,如图1所示。
图一
点击服务名字就能得到相应的WSDl文件。
在编写、发布和测试WebService时应注意如下几点:
1. POJO类不能使用package关键字声明包。
2. Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果想取消Axis2的热发布功能,可以打开%TomcatHome%\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置代码:
<parameter name="hotdeployment">true</parameter>
<parameter name="hotupdate">true</parameter>
<parameter name="enableMTOM">false</parameter>
<parameter name="enableSwA">false</parameter>
将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新,也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。在axis2.xml文件中找到
<parameter name="hotupdate">false</parameter>
将false改为true即可。
3.发布WebService的pojo目录只是默认的,如果读者想在其他的目录发布WebService,可以打开axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
<deployer extension=".class" directory="yourDirectory" class="org.apache.axis2.deployment.POJODeployer"/>
上面的配置允许在%TomcatHome%\webapps\axis2\WEB-INF\yourDirectory目录中发布WebService。例如,将本例中的Service.class复制到ourDirectory目录中也可以成功发布,但要删除POJO目录下的类Service.class,以免造成WebService会重名。
四、Java调用webservice
Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。wsdl2java.bat命令可以在%Axis2安装目录%bin目录中找到。在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是<Axis2安装目录>。
AXIS2_HOME环境变量,配置如图二所示
图二
调用WebService的代码生成:
把\webapps\axis2-1.4.1-bin\axis2-1.4.1\bin\wsdl2java.bat拖到cmd命令行中
紧接着添加"-uri http://localhost:8080/axis2/services/Service?wsdl -p client -s -o service"回车后在如下目录中就可以找到ServiceStub.java类,如图三所示
图三
在此重提一下Java环境变量的配置
PATH:%JAVA_HOME%/bin
CLASSPATH:%JAVA_HOME%/lib
JAVA_HOME:JDK的安装目录
在装有多个JDK的时候,JAVA_HOME要指定唯一的JDK,即JAVA_HOME的值是唯一的,否则在执行上面的命令时会出现图四的错误。
图四
生成了ServiceStub.java类后,就可以在Eclipse中使用客户端调用webservice了,把上述目录放进Eclipse工作路径,新建Java项目,名字为service,项目建好后导入Axis2包,之后新建TestService.java类,代码如下:
执行客户端后将在控制台看到如下信息,如图五所示
图五
至此,webservice发布及Java中调用完成。
五、用C#调用webservice
用Visual Studio 2010新建一个项目WebserviceTest.
项目建好之后,在菜单栏的“项目”中点击“添加服务引用...”如图六
图六
点击“高级...”之后点击“添加web引用...”在URL中输入WSDL文件地址http://localhost:8080/axis2/services/Service?wsdl,即能找到相应的服务,在“web引用名”改成自己想要的名称,之后点击“添加引用”。如图七
图七
添加完服务之后便在Program.cs写客户端,客户端代码如下:
调试程序前,要先把发布的服务启动,即启动Tomcat,后执行客户端程序,就可得到如图八所示结果。
图八