主要有三种方式:

第一RPC方式,不生成客户端代码

第二,document方式,不生成客户端代码

第三,用wsdl2java工具,生成客户端方式调用

java代码:

  1. package samples.quickstart.client;
  2.  
  3. import javax.xml.namespace.QName;
  4. import org.apache.axiom.om.OMAbstractFactory;
  5. import org.apache.axiom.om.OMElement;
  6. import org.apache.axiom.om.OMFactory;
  7. import org.apache.axiom.om.OMNamespace;
  8. import org.apache.axis2.AxisFault;
  9. import org.apache.axis2.addressing.EndpointReference;
  10. import org.apache.axis2.client.Options;
  11. import org.apache.axis2.client.ServiceClient;
  12. import org.apache.axis2.rpc.client.RPCServiceClient;
  13. import samples.quickstart.StockQuoteServiceStub;
  14. import samples.quickstart.xsd.GetPrice;
  15. import samples.quickstart.xsd.GetPriceResponse;
  16.  
  17. public class StockQuoteClient {
  18.  
  19. /**
  20. * 方法一:
  21. * 应用rpc的方式调用 这种方式就等于远程调用,
  22. * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
  23. * 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
  24. *
  25. 【注】:
  26.  
  27. 如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
  28. 第一个参数的类型是QName对象,表示要调用的方法名;
  29. 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
  30. 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
  31. 第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
  32.  
  33. 如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
  34. 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
  35.  
  36. 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
  37. 也就是 <wsdl:definitions>元素的targetNamespace属性值。
  38. *
  39. */
  40. public static void testRPCClient() {
  41. try {
  42. // axis1 服务端
  43. // String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
  44. // axis2 服务端
  45. String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";
  46.  
  47. // 使用RPC方式调用WebService
  48. RPCServiceClient serviceClient = new RPCServiceClient();
  49. // 指定调用WebService的URL
  50. EndpointReference targetEPR = new EndpointReference(url);
  51. Options options = serviceClient.getOptions();
  52. //确定目标服务地址
  53. options.setTo(targetEPR);
  54. //确定调用方法
  55. options.setAction("urn:getPrice");
  56.  
  57. /**
  58. * 指定要调用的getPrice方法及WSDL文件的命名空间
  59. * 如果 webservice 服务端由axis2编写
  60. * 命名空间 不一致导致的问题
  61. * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
  62. */
  63. QName qname = new QName("http://quickstart.samples/xsd", "getPrice");
  64. // 指定getPrice方法的参数值
  65. Object[] parameters = new Object[] { "13" };
  66.  
  67. // 指定getPrice方法返回值的数据类型的Class对象
  68. Class[] returnTypes = new Class[] { double.class };
  69.  
  70. // 调用方法一 传递参数,调用服务,获取服务返回结果集
  71. OMElement element = serviceClient.invokeBlocking(qname, parameters);
  72. //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
  73. //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
  74. String result = element.getFirstElement().getText();
  75. System.out.println(result);
  76.  
  77. // 调用方法二 getPrice方法并输出该方法的返回值
  78. Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
  79. // String r = (String) response[0];
  80. Double r = (Double) response[0];
  81. System.out.println(r);
  82.  
  83. } catch (AxisFault e) {
  84. e.printStackTrace();
  85. }
  86. }
  87.  
  88. /**
  89. * 方法二: 应用document方式调用
  90. * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
  91. */
  92. public static void testDocument() {
  93. try {
  94. // String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
  95. String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
  96.  
  97. Options options = new Options();
  98. // 指定调用WebService的URL
  99. EndpointReference targetEPR = new EndpointReference(url);
  100. options.setTo(targetEPR);
  101. // options.setAction("urn:getPrice");
  102.  
  103. ServiceClient sender = new ServiceClient();
  104. sender.setOptions(options);
  105.  
  106. OMFactory fac = OMAbstractFactory.getOMFactory();
  107. String tns = "http://quickstart.samples/";
  108. // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
  109. OMNamespace omNs = fac.createOMNamespace(tns, "");
  110.  
  111. OMElement method = fac.createOMElement("getPrice", omNs);
  112. OMElement symbol = fac.createOMElement("symbol", omNs);
  113. // symbol.setText("1");
  114. symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
  115. method.addChild(symbol);
  116. method.build();
  117.  
  118. OMElement result = sender.sendReceive(method);
  119.  
  120. System.out.println(result);
  121.  
  122. } catch (AxisFault axisFault) {
  123. axisFault.printStackTrace();
  124. }
  125. }
  126.  
  127. /**
  128. * 为SOAP Header构造验证信息,
  129. * 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息
  130. *
  131. * @param serviceClient
  132. * @param tns 命名空间
  133. * @param user
  134. * @param passwrod
  135. */
  136. public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {
  137. OMFactory fac = OMAbstractFactory.getOMFactory();
  138. OMNamespace omNs = fac.createOMNamespace(tns, "nsl");
  139. OMElement header = fac.createOMElement("AuthenticationToken", omNs);
  140. OMElement ome_user = fac.createOMElement("Username", omNs);
  141. OMElement ome_pass = fac.createOMElement("Password", omNs);
  142.  
  143. ome_user.setText(user);
  144. ome_pass.setText(passwrod);
  145.  
  146. header.addChild(ome_user);
  147. header.addChild(ome_pass);
  148.  
  149. serviceClient.addHeader(header);
  150. }
  151.  
  152. /**
  153. * 方法三:利用axis2插件生成客户端方式调用
  154. *
  155. */
  156. public static void testCodeClient() {
  157. try {
  158. String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
  159. StockQuoteServiceStub stub = new StockQuoteServiceStub(url);
  160. GetPrice request = new GetPrice();
  161. request.setSymbol("ABCD");
  162. GetPriceResponse response = stub.getPrice(request);
  163. System.out.println(response.get_return());
  164. } catch (org.apache.axis2.AxisFault e) {
  165. e.printStackTrace();
  166. } catch (java.rmi.RemoteException e) {
  167. e.printStackTrace();
  168. }
  169.  
  170. }
  171.  
  172. public static void main(String[] args) {
  173. StockQuoteClient.testRPCClient();
  174. // StockQuoteClient.testDocument();
  175. // StockQuoteClient.testCodeClient();
  176.  
  177. }
  178. }

wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。
命令行格式为:WSDL2Java [options] -uri <url or path> : A url or path to a WSDL

例如:

wsdl2java -uri http://localhost:8080/cxfService_0617/services/Hellows?wsdl -s -o build\client

其中常用的options具体如下:
-o <path> : 指定生成代码的输出路径
-a : 生成异步模式的代码
-s : 生成同步模式的代码
-p <pkg> : 指定代码的package名称
-l <languange> : 使用的语言(Java/C) 默认是java
-t : 为代码生成测试用例
-ss : 生成服务端代码 默认不生成
-sd : 生成服务描述文件 services.xml,仅与-ss一同使用
-d <databinding> : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
-g : 生成服务端和客户端的代码
-pn <port_name> : 当WSDL中有多个port时,指定其中一个port
-sn <serv_name> : 选择WSDL中的一个service
-u : 展开data-binding的类
-r <path> : 为代码生成指定一个repository
-ssi : 为服务端实现代码生成接口类
-S : 为生成的源码指定存储路径
-R : 为生成的resources指定存储路径
–noBuildXML : 输出中不生成build.xml文件
–noWSDL : 在resources目录中不生成WSDL文件
–noMessageReceiver : 不生成MessageReceiver类

axis2调用webService几种方式的更多相关文章

  1. Java调用WebService方法总结(5)--Axis2调用WebService

    Axis2是新一点Axis,基于新的体系结构进行了全新编写,有更强的灵活性并可扩展到新的体系结构.文中demo所使用到的软件版本:Java 1.8.0_191.Axis2 1.7.9. 1.准备 参考 ...

  2. DLL调用的两种方式(IDE:VC6.0,C++)

    原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...

  3. python 模块调用的几种方式

    在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import  模块里面的小功能 3,from  模块 ...

  4. webService调用的N种方式

    一.服务器端代码 新建一个web Service Project工程(貌似普通的java工程也可以,这里不太明白各种webService的框架有什么区别),建立如下的类: package com.bo ...

  5. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  6. axis2调用webservice

    public static long TIMEOUTINMILLISECONDS=100000; /** * 调用webservice * @param url webserviceURL * @pa ...

  7. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  8. Struts2方法调用的三种方式

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...

  9. springcloud 服务调用的两种方式

    spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign.Ribbon是一个基于HTTP和TCP客户端的负载均衡器,其实feign也使用了rib ...

随机推荐

  1. ABAP开发顾问必备:SAP ABAP开发技术总结[转载]

    转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...

  2. MySQL 5.7增强半同步测试

            we've know the machenism of semi-synchronous replication in my previous article,let's do som ...

  3. svn出现目标计算机积极拒绝无法链接

    这是由于没有启动服务器端监控的原因,只需要执行以下代码即可 svnserve -d --listen-port 8000 -r /opt/svn

  4. python爬虫学习笔记(2)-----代理模式

    一.UserAgent UserAgent 中文意思是用户代理,简称UA,它是一个特殊字符串头,使得服务器能够识别用户 设置UA的两种方式: 1.heads from urllib import re ...

  5. 论反向ajax

    在讨论反向ajax之前,说一下我大二写的一个聊天程序,通过前端ajax不断向服务器发送请求(通过http连接),服务器进行一次数据库查询,然后返回结果,断开与服务器的链接(绝大部分都是无用的结果)来维 ...

  6. FMX有一套自己的消息处理机制。类似这样:

    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Var ...

  7. Linux重启命令介绍

    下面介绍在 Linux 操作系统中重启和关闭相关的命令:shutdown.reboot.init.halt.poweroff.systemctl,你可以根据需要来选择适合的 Linux 命令关闭或重新 ...

  8. 20190118-利用Python实现Pig Latin游戏

    1.利用Python实现Pig Latin字母游戏 “Pig Latin”是一个英语儿童文字改写游戏,整个游戏遵从下述规则:a. 元音字母是‘a’.‘e’.‘i’.‘o’.‘u’.字母‘y’在不是第一 ...

  9. TensorFlow实现线性回归

    from __future__ import print_function import tensorflow as tf import numpy import matplotlib.pyplot ...

  10. C指针(2)——指针在函数中的应用(程序讲解)

    3-1.c指针用作函数参数 #include<stdio.h> typedef unsigned char uint8_t; //类型自定义,通过typedef语句重新把unsigned ...