加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用axis2进行WebService的开发

发布时间:2020-12-16 23:09:06 所属栏目:安全 来源:网络整理
导读:使用axis2进行WebService的开发 Apache Axis2 是 Apache Axis SOAP 项目的后继项目。此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服务的体系结构(Service-Oriented Architecture,SOA)的下一代平台。 axis2 WebService开发分为服务端
使用axis2进行WebService的开发

Apache Axis2 是 Apache Axis SOAP 项目的后继项目。此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服务的体系结构(Service-Oriented Architecture,SOA)的下一代平台。
axis2 WebService开发分为服务端开发与客户端开发,服务端开发为对外提供服务,客户端开发为用户调用外部接口进行业务处理。

一、下载与安装

1.下载

下载地址:http://axis.apache.org/axis2/java/core/download.cgi
有以下下载列表:
Binary Distribution zip | MD5 | PGP?
Source Distribution zip | MD5 | PGP?
WAR Distribution zip | MD5 | PGP?
Documents Distribution zip | MD5 | PGP

注:
axis2-1.6.2-bin.zip里有axis2的jar包。
axis2-1.6.2-docs.zip里有详细的帮助文档。
axis2-1.6.2-src.zip里是源代码。
axis2-1.6.2-war.zip里是axis的管理平台,放到tomcat可直接使用。

注:本文用bin包进行命令行使用axis2,管理平台使用的是war包。

2.安装配置

将axis2-1.6.2-bin.zip解压到本地目录D:axis2-1.6.2

设置环境变量。【注:前提需要配置java环境变量】
AXIS2_HOME 设置值 D:axis2-1.6.2
Path 添加值 %AXIS2_HOME%bin

二、服务端编写

1.创建服务端的java项目testAsixServer。

编写类City与类User代码如下:
[java]? view plain copy
  1. package?com.hsinghsu.model;??
  2. ??
  3. public?class?City??
  4. {??
  5. ????private?int?cityCode;??
  6. private?String?cityName;??
  7. int?getCityCode()??
  8. ????{??
  9. ????????return?cityCode;??
  10. ????}??
  11. ??
  12. ????void?setCityCode(int?cityCode)??
  13. ????{??
  14. ????????this.cityCode?=?cityCode;??
  15. ????}??
  16. public?String?getCityName()??
  17. return?cityName;??
  18. void?setCityName(String?cityName)??
  19. this.cityName?=?cityName;??
  20. }??
copy
    class?User??
  1. int?id;??
  2. private?String?name;??
  3. private?String?password;??
  4. private?City?city;??
  5. int?getId()??
  6. return?id;??
  7. void?setId(int?id)??
  8. this.id?=?id;??
  9. public?String?getName()??
  10. return?name;??
  11. void?setName(String?name)??
  12. this.name?=?name;??
  13. public?String?getPassword()??
  14. return?password;??
  15. void?setPassword(String?password)??
  16. this.password?=?password;??
  17. public?City?getCity()??
  18. return?city;??
  19. void?setCity(City?city)??
  20. this.city?=?city;??
  21. }??
编写服务类UserService。该服务类即为对外提供的服务,其中对外提供2个服务getUserById与getUserList,代码如下:
copy
    package?com.hsinghsu.service;??
  1. import?java.util.ArrayList;??
  2. import?java.util.List;??
  3. import?com.hsinghsu.model.User;??
  4. class?UserService??
  5. {??
  6. public?List<User>?getUserList(User?user)??
  7. ????????List<User>?list?=?new?ArrayList<User>();??
  8. return?list;??
  9. public?User?getUserById(int?id)??
  10. ????????User?user?=?new?User();??
  11. return?user;??
  12. }??

2.发布WebService服务

发布WebService服务方式可使用axis2管理平台发布,本文另添加使用soapUI发布WebService的测试服务。

2.1 axis2管理平台发布

2.1.1 部署axis2管理平台

将axis2-1.6.1-war.zip压缩包里面的axis2.war包解压到tomcat的webapps目录下,启动tomcat,访问地址http://127.0.0.1:8080/axis2/ ,即可访问axis2的Welcome!页面。
访问地址http://127.0.0.1:8080/axis2/services/listServices 另可访问服务列表。

2.1.2 部署开发服务

编译服务端项目testAsixServer后,将UserService.class文件放到tomcatwebappsaxis2WEB-INFpojo目录中【注:若没有pojo目录,则手动新建该目录】。
在浏览器地址栏中输入如下的URL:
http://127.0.0.1:8080/axis2/services/listServices 即可访问刷新后的服务列表。【注:POJO类不能使用package关键字声明包,若使用axis2管理平台发布,则需要修改UserService类,去掉package字段。】

【注:发布WebService的pojo目录只是默认的,如果想在其他的目录发布WebService,可以打开axis2/WEB-INF/conf/axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
<deployer extension=".class" directory="mydir" class="org.apache.axis2.deployment.POJODeployer"/>】

访问 http://127.0.0.1:8080/axis2/services/UserService?wsdl 即可访问服务UserService的wsdl描述

【注:另可使用jar cvf命令将服务打成aar包后导入到axis2管理平台上使用。】

2.2 使用soapUI生成WAR发布WebService测试服务


2.2.1 由java生成wsdl文件

运用Java2wsdl生成wsdl文件

使用cmd命令,在命令行中输入:
java2wsdl -cn com.hsinghsu.service.UserService
【注:在testAsixServer项目的classes根目录下执行】

输出:
Using AXIS2_HOME: ? D:axis2-1.6.2
Using JAVA_HOME: ? ?C:Program FilesJavajdk1.6.0_01
log4j:WARN No appenders could be found for logger (org.apache.axis2.util.Loader).
log4j:WARN Please initialize the log4j system properly.

结果:
生成UserService.wsdl文件

2.2.2 soapUI导出war包:

在soapUI导入UserService.wsdl文件。
通过soapUI生成MockService。
启动MockService,测试MockService时,在URL填写http://HSING-PC:8088/mockUserServiceSoap11Binding 后点击运行,查看是否有正确报文返回。
soapUI发送报文如下:
[html]? copy
    <soapenv:Envelope?xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:ser="http://service.hsinghsu.com">??
  1. ???soapenv:Header/>??
  2. ???soapenv:Body ??????ser:getUserById>??
  3. ?????????<!--Optional:-->??
  4. ?????????ser:id>2</ ??????soapenv:Envelope>??
soapUI接收报文如下:
copy
    soapenv:Envelope?xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:ser="http://service.hsinghsu.com"?xmlns:xsd="http://model.hsinghsu.com/xsd"ser:getUserByIdResponseser:return ???????????? ????????????xsd:city ??????????????? ???????????????xsd:cityCode>001xsd:cityName>wh ???????????? ????????????<!--Optional:-->??
  1. xsd:id>1xsd:name>hsinghsuxsd:password>123456>??
在soapUI中导出war包,如testUser.war。

2.2.3 部署war包

将war包部署到tomcat目录下。【注:需要修改war包里面的WEB-INF/soapui/testUser-soapui-project.xml文件引用wsdl文件的路径】
启动tomcat,访问在war所在的路径如 http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding?WSDL ,即可查看wsdl描述文件
【注:可以使用soapUI测试接口,在soapUI测试中,URL中填写testUser.war的部署地址,如http://ip:port/testUser/mockUserServiceSoap11Binding ,点击运行,查看对应的接口是否有正确报文返回。】

三、客户端编写


Axis2支持以下4种类型的客户端:
i. ?Block(阻塞式客户端),即传统客户端。一旦服务被启用,客户端的应用程序将被挂起,直到operation被执行完毕(表现为收到一个response或fault),才能重新获得控制权。这是调用Web Service最简单的方式,并且这种方式适用于多数业务情形。
ii. Non block(非阻塞式客户端),即异步客户端。使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API,一旦服务被起用,客户端应用程序马上得到控制权,通过使用一个callback对象来获得response。这种方式使得客户端应用程序可以很方便的同步启用多个Web Service。
iii.双工(双向传输)。以上的机制都使用单一的连接去发送请求和接收响应.这都明显在性能上落后于使用两条连接(单向或双向)进行进行请求和响应的传输 . 因此以上的机制都不能解决长时间运行的交易,连接将在操作还没完成就会超时. 一种解决方案是使用分开的两条传输连接来传输请求和响应 . 我们叫这种方案为传输层异步。
iv. 双工非阻塞(双向且非阻塞传输)。

注:axis2 webservice client端需要的jar包有:
[plain]? copy
    axis2-kernel-1.6.1.jar??
  1. axis2-adb-1.6.1.jar??
  2. axiom-api-1.2.12.jar??
  3. commons-logging-1.1.1.jar??
  4. wsdl4j-1.6.2.jar??
  5. XmlSchema-1.4.7.jar??
  6. axiom-impl-1.2.12.jar??
  7. neethi-3.0.1.jar??
  8. axis2-transport-local-1.6.1.jar??
  9. axis2-transport-http-1.6.1.jar??
  10. commons-httpclient-3.1.jar??
  11. httpcore-4.0.jar??
  12. commons-codec-1.3.jar??
  13. mail-1.4.jar???

1.传统客户端【阻塞式客户端的编写】

新建AsixBlockClient类,获取数据,代码如下:
copy
    package?com.hsinghsu.asix.client;??
  1. import?org.apache.axiom.om.OMAbstractFactory;??
  2. import?org.apache.axiom.om.OMElement;??
  3. import?org.apache.axiom.om.OMFactory;??
  4. import?org.apache.axiom.om.OMNamespace;??
  5. import?org.apache.axis2.AxisFault;??
  6. import?org.apache.axis2.addressing.EndpointReference;??
  7. import?org.apache.axis2.client.Options;??
  8. import?org.apache.axis2.client.ServiceClient;??
  9. /**?
  10. ?*??
  11. ?*?Block(阻塞式客户端),即传统客户端调用WebService?Axis2的底层API来调用WebService?
  12. ?*?@author?hsinghsu?
  13. ?*/??
  14. class?AsixBlockClient??
  15. static?EndpointReference?targetEPR?=?new?EndpointReference(??
  16. ????????????"http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding");//接口地址??
  17. static?void?main(String[]?args)??
  18. ????????Options?options?=?new?Options();??
  19. ????????options.setAction("urn:getUserById");//调用接口方法??
  20. ????????options.setTo(targetEPR);??
  21. ????????ServiceClient?sender?=?null;??
  22. try??
  23. ????????{??
  24. ????????????sender?=?new?ServiceClient();??
  25. ????????????sender.setOptions(options);??
  26. ????????????OMFactory?fac?=?OMAbstractFactory.getOMFactory();??
  27. ????????????OMNamespace?omNs?=?fac.createOMNamespace(??
  28. ????????????????????"http://service.hsinghsu.com",?"");??
  29. ????????????OMElement?method?=?fac.createOMElement("getUserById",?omNs);??
  30. ????????????OMElement?name?=?fac.createOMElement("id",?omNs);//设置入参名称??
  31. ????????????name.setText("1");//设置入参值??
  32. ????????????method.addChild(name);??
  33. ????????????method.build();??
  34. ????????????System.out.println("method:"?+?method.toString());//?print:<getUserById?xmlns="http://service.hsinghsu.com"><id>1</id></getUserById>??
  35. ????????????OMElement?response?=?sender.sendReceive(method);??
  36. ????????????System.out.println("response:"?+?response);??
  37. ????????????OMElement?elementReturn?=?response.getFirstElement().getFirstElement().getFirstElement();??
  38. ????????????System.out.println("cityCode:"+elementReturn.getText());??
  39. ????????}??
  40. catch?(AxisFault?e)??
  41. ????????????System.out.println("Error");??
  42. ????????????e.printStackTrace();??
  43. ????????}??
  44. }??
执行结果如下:
copy
    method:<getUserById?xmlns="http://service.hsinghsu.com"><id>1</id></getUserById>??
  1. response:<ser:getUserByIdResponse?xmlns:ser="http://service.hsinghsu.com">??
  2. ?????????<!--Optional:-->??
  3. ?????????<ser:return>??
  4. ????????????<!--Optional:-->??
  5. ????????????<xsd:city?xmlns:xsd="http://model.hsinghsu.com/xsd">??
  6. ???????????????<!--Optional:-->??
  7. ???????????????<xsd:cityCode>001</xsd:cityCode>??
  8. ???????????????<xsd:cityName>wh</xsd:cityName>??
  9. ????????????</xsd:city>??
  10. ????????????<!--Optional:-->??
  11. ????????????<xsd:id?xmlns:xsd="http://model.hsinghsu.com/xsd">1</xsd:id>??
  12. ????????????<xsd:name?xmlns:xsd="http://model.hsinghsu.com/xsd">hsinghsu</xsd:name>??
  13. ????????????<xsd:password?xmlns:xsd="http://model.hsinghsu.com/xsd">123456</xsd:password>??
  14. ?????????</ser:return>??
  15. ??????</ser:getUserByIdResponse>??
  16. cityCode:001??

2.使用RPC方法调用WebService

编写AsixRPCClient.java类,获取数据。注:添加User.java、City.java至项目中。
AsixRPCClient.java代码如下:
copy
    import?javax.xml.namespace.QName;??
  1. import?org.apache.axis2.addressing.EndpointReference;??
  2. import?org.apache.axis2.client.Options;??
  3. import?org.apache.axis2.rpc.client.RPCServiceClient;??
  4. import?com.hsinghsu.model.User;??
  5. /**?
  6. ?*?使用RPC方式调用WebService?
  7. class?AsixRPCClient??
  8. ?????????*?@param?args?
  9. ?????*/??
  10. void?main(String[]?args)?throws?Exception??
  11. ????????//?使用RPC方式调用WebService??
  12. ????????RPCServiceClient?serviceClient?=?new?RPCServiceClient();??
  13. ????????Options?options?=?serviceClient.getOptions();??
  14. ????????EndpointReference?targetEPR?=?new?EndpointReference(??
  15. ????????????????"http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding");//?指定调用WebService的URL??
  16. ????????Object[]?opAddEntryArgs?=?new?Object[]{new?Integer(1)};//?指定getGreeting方法的参数值??
  17. ????????Class[]?classes?=?new?Class[]{User.class};//?指定getGreeting方法返回值的数据类型的Class对象??
  18. ????????QName?opAddEntry?=?new?QName("http://service.hsinghsu.com",??
  19. ????????????????"getUserById");//?指定要调用的getGreeting方法及WSDL文件的命名空间??
  20. ????????Object[]?objects?=?serviceClient.invokeBlocking(opAddEntry,??
  21. ????????????????opAddEntryArgs,?classes);//?RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new?Object[]{}。??
  22. ????????System.out.println("?objects?size-->:"?+?objects.length);??
  23. if?(objects.length?>=?1)??
  24. ????????{??
  25. ????????????User?user?=?new?User();??
  26. ????????????user?=?(User)?objects[0];??
  27. ????????????System.out.println("=="?+?user.getId()?+?"?=="?+?user.getName()??
  28. ????????????????????+?"?=="?+?user.getCity().getCityName());??
  29. }??
运行结果:
?objects size-->:1[Ljava.lang.Object;@ba5c7a
==1 ==hsinghsu ==wh

3.使用Stub方式调用WebService

运用wsdl2java简化客户端,使用Stub方式调用WebService

3.1 生成STUB文件。

在cmd中用 wsdl2java生成stub文件。注:在wsdl文件目录下执行
输入:
wsdl2java -uri UserService.wsdl
【注:默认adb生成方式,同步生成方式,加参数-a则使用异步生成】

输出:
Using AXIS2_HOME: ? D:axis2-1.6.2
Using JAVA_HOME: ? ?C:Program FilesJavajdk1.6.0_01
Retrieving document at 'UserService.wsdl'.
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder).
log4j:WARN Please initialize the log4j system properly.

结果:
生成build.xml、UserServiceStub.java、UserServiceCallbackHandler.java文件

3.2 编写同步调用函数

编写AsixServiceStub类,获取数据。
AsixServiceStub.java代码如下:
copy
    import?com.hsinghsu.service.UserServiceStub;??
  1. import?com.hsinghsu.service.UserServiceStub.GetUserById;??
  2. import?com.hsinghsu.service.UserServiceStub.User;??
  3. ?*?利用axis2插件生成客户端方式调用?wsdl2java简化客户端的编写?
  4. class?AsixServiceStub??
  5. throws?Exception??
  6. ????????UserServiceStub?stub?=?new?UserServiceStub();??
  7. ????????GetUserById?guid?=?new?GetUserById();??
  8. ????????guid.setId(1);??
  9. ????????User?user?=?stub.getUserById(guid).get_return();//?同步调用方式??
  10. if?(null?!=?user)??
  11. ????????????System.out.println("=="?+?user.getId()?+?"?=="?+?user.getName()??
  12. ????????????????????+?"?=="?+?user.getCity().getCityName());??
  13. else??
  14. ????????????System.out.println("user?null");??
  15. }??
运行结果:
==1 ==hsinghsu ==wh

注:添加UserServiceStub.java、UserServiceCallbackHandler.java文件至项目中,注意修改UserServiceStub.java类中服务的地址。

注:若需要使用异步调用,则需创建异步回调类AsynCallback,该类需要继承UserServiceCallbackHandler抽象类,实现回调函数receiveResultgetUserById接口。在AsixServiceStub中,只需要使用stub.startgetUserById(guid,new AsynCallback());执行即可。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读