之前开发webservice客户端的时候遇到一个使用Axis2开发接口的厂家,查资料把Axis1和Axis2客户端的开发方式总结如下:

基于Axis1服务端的客户端实现:

/*** 使用Axis Call Client动态调用WebService* @param requestXml 请求报文* @param wsdl webservice地址* @param targetNamespace 命名空间* @param webServiceMethod 访问的方法名* @return*/
public String getRespByAxisCallClient(String requestXml, String wsdl,String targetNamespace, String webServiceMethod){String respXml = "";try{Service service = new Service();Call call = (Call) service.createCall();//设置要访问的WSDL地址call.setTargetEndpointAddress(new URL(wsdl));//设置要访问的方法名call.setOperationName(new QName(wsdl,webServiceMethod));//设置参数call.addParameter("XMLFrom", XMLType.XSD_STRING, ParameterMode.IN);//设置返回值类型call.setReturnType(XMLType.XSD_STRING);//调用服务respXml = (String) call.invoke(new Object[] { requestXml.toString() });           }catch(Exception e){logger.error("服务调用异常",e);}return respXml;
}

Call在线API:http://axis.apache.org/axis/java/apiDocs/org/apache/axis/client/Call.html

基于Axis2服务端的客户端实现:
方法一:
采用RPC的方式进行远程调用,通过URL定位告诉远程服务器需要调用的方法名、参数等,调用远程服务,获取结果。如果被调用的WebService方法有返回值,应使invokeBlocking 方法 该方法有三个参数:第一个参数的类型是QName对象,表示要调用的方法名;第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法。该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是 <wsdl:definitions>元素的targetNamespace属性值。方法如下:
/*** 方法一:RPC调用webservice Axis2服务* @param wsdl 接口服务端调用地址* @param webServiceMethod 调用方法* @param inParam 请求参数* @param targetNamespace 命名空间* @return*/
public String getRespByAxisRPCClient(Map<String,Object> inParam, String wsdl,String targetNamespace, String webServiceMethod){String responseStr = "";RPCServiceClient serviceClient = null;
try{//获取RPCServiceClient对象serviceClient = new RPCServiceClient();//获取Options对象Options options = serviceClient.getOptions();//指定调用webservice的URLEndpointReference targetERP = new EndpointReference(wsdl);options.setTo(targetERP);//指定要调用的方法及wsdl文件的命名空间QName opAddEntry = new QName("http://ws.apache.org/axis2",webServiceMethod);//指定method的入参Object[] opAddEntryArgs = inParam.values().toArray();//指定方法返回值的数据类型class对象Class[] classes = new Class[]{String.class};//调用服务responseStr = (String) serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0];
}catch(Exception e){logger.error("RPCServiceClient error",e);throw new RuntimeException("RPCServiceClient error",e);
}finally{try {serviceClient.cleanupTransport();} catch (AxisFault e) {logger.error("RPCServiceClient cleanupTransport error",e);throw new RuntimeException("RPCServiceClient error",e);}
}return responseStr;
}
注意:
1、如果被调用的WebService方法有返回值,应使用invokeBlocking方法,该方法有三个参数:
第一个参数的类型是QName对象,表示要调用的方法名;
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
第三个参数表示WebService方法的,返回值类型的Class对象,参数类型为Class[]。
2、如果返回对象是String类型的字符串,参数为String.class;如果返回对象是double类型的数字,参数为double.class。
3、如果被调用的WebService方法没有返回值,应使用invokeRobust方法:该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
在开发过程中遇到以下错误:

错误一:

查找资料发现问题出在缺少必要的jar包上,经测试得知,使用RPCServiceClient所需的最少jar包如下:
axiom-api-1.2.13.jar
axiom-impl-1.2.13.jar
axis2-adb-1.6.2.jar
axis2-kernel-1.6.2.jar
axis2-transport-http-1.6.2.jar
axis2-transport-local-1.6.2.jar
commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.jar
httpcore-4.0.jar
neethi-3.0.2.jar
wsdl4j-1.6.2.jar
XmlSchema-1.4.7.jar

错误二:

原因:webservice调用连接池默认只有两个连接,每次调用完必须释放连接,否则很快就会没连接。需要在finally中加入以下代码,释放掉已有的连接。
finally{try {serviceClient.cleanupTransport();} catch (AxisFault e) {logger.error("RPCServiceClient cleanupTransport error",e);throw new RuntimeException("RPCServiceClient error",e);}
}

错误三:


原因:缺少jar包 mail-1.4.jar
方法二:
/*** 方法二: 应用document方式调用 webservice服务,用ducument方式可以摆脱我们不想要的耦合* @param wsdl webservice地址**/public static void getRespByDocument(String wsdl,String user,String password) {try {//获取Options对象Options options = new Options(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(wsdl); options.setTo(targetEPR); // options.setAction("urn:getPrice"); //获取ServiceClient对象ServiceClient serviceClient = new ServiceClient(); serviceClient.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); String tns = "http://quickstart.samples/"; // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时会出问题OMNamespace omNs = fac.createOMNamespace(tns, ""); OMElement method = fac.createOMElement("getPrice", omNs); OMElement symbol = fac.createOMElement("symbol", omNs); // symbol.setText("1"); symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String ")); method.addChild(symbol); method.build(); //为SOAP Header构造验证信息addValidation(serviceClient,tns,user,password);//调用服务OMElement result = serviceClient.sendReceive(method); }catch (AxisFault axisFault) { axisFault.printStackTrace(); } }/*** 为SOAP Header构造验证信息,* 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息** @param serviceClient* @param tns 命名空间* @param user* @param passwrod*/ public static void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) { OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace(tns, "nsl"); OMElement header = fac.createOMElement("AuthenticationToken", omNs); OMElement ome_user = fac.createOMElement("Username", omNs); OMElement ome_pass = fac.createOMElement("Password", omNs); ome_user.setText(user); ome_pass.setText(passwrod); header.addChild(ome_user); header.addChild(ome_pass); serviceClient.addHeader(header); } 

基于Axis服务端的webservice客户端实现相关推荐

  1. 【REST】基于RESTful服务端的客户端实现(HttpClient、RestTemplate、HttpURLConnection)

    最近一直在做针对webservice的接口协议对接,总结了一下基于restful服务端的客户端的实现方式,有以下三种: HTTPClient RestTemplate HttpURLConnectio ...

  2. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  3. websocket服务端和html客户端进行二进制数据交互

    一.概念和理论理解 1.HTTP HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接. 无状态:每次连接只处理一个请求,请求结束后断开连接. 无连接:对于事务处理没有 ...

  4. ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息

    找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...

  5. 服务端渲染vs客户端渲染到前后端同构

    关于服务端渲染与客户端渲染的优劣,互联网上已经有过很多的文章进行过分析,在这里我谈一下我个人的见解. 首先,还是来老生常谈一下关于两种渲染方式的主要优劣: 服务端渲染(仅列出当下最突出的优劣): 优: ...

  6. 服务端渲染与客户端渲染详解(vue)

    1.客户端请求 (1)用户在浏览器输入请求的地址例如:172.0.0.1:8080 到服务器 服务器接受到客户端的请求拿到一个没有被数据渲染的空页面 (2)客户端拿到服务端的空字符串页面,然后从上往下 ...

  7. WebService入门教程(服务端发布WebService)

    本篇内容过多,时间紧迫的朋友可以通过目录快速筛选自己想要看的内容,本人接触webservice也没多久,也处于学习阶段,如果有错误请指正,如果已经是大神请略过这篇文章,这篇文章不涉及webservic ...

  8. android mqtt服务器搭建,Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)

    一.简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议. 此处不再引入官方文字描述,以个人开发认识浅谈一下 本文分为两部分: 1. M ...

  9. netty tcp服务端主动断开客户端_「Netty核心技术」6-ChannelPipeline源码

    ChannelPipeline是Channelhandler的容器,它负责ChannelHandler的管理和事件拦截与调度. 土话: ChannelPipeline就是用来管理Channelhand ...

最新文章

  1. OpenSceneGraph 笔记--如何导出三角形数据
  2. matlan数据分析库函数
  3. Docker Review - Docker 概念 入门篇
  4. Hyperopt中文文档:Cite引用
  5. cdlinux miniwdep 配置无线网卡
  6. 380万赌石(翡翠原石)切出2亿,现在值多少钱了?
  7. JAVA DES加密解密代码范例
  8. Spine_图片显示出错的处理方法
  9. Activity的神奇启动模式之singleTask
  10. 【NDN安全】Poseidon: Mitigating Interest Flooding DDoS Attacks in Named Data Networking 学习笔记
  11. iis中应用程序服务器错误,iis应用程序服务器错误
  12. 基于VisMockup装配公差分析技术(VisVSA)的介绍
  13. 非参数统计的Python实现——卡方独立性检验
  14. 如何给图片加水印?这三个图片加水印方法,帮你添加花式水印
  15. Rushcrm:如何利用CRM系统的权限设置
  16. 圣天诺SuperPro狗模拟视频语音教程
  17. c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. BI神器Power Query(16)-- PQ制作时间维度表(5)
  19. 背景随意更换,同时改变多个竖屏短视频背景图片的两种方法
  20. 2018年英语专升本英语阅读「Part II 阅读专区」【文章(图片)、答案、词汇记忆】

热门文章

  1. 选择or不选择苹果的理由
  2. securecrt连接GNS3步骤
  3. 被边缘化的“卓越亚马逊”
  4. Windows Vista Upgrade Advisor 1.0
  5. mongoDB 从单节点迁移到分布式集群 遇到的问题
  6. Android 的singleLine废弃解决
  7. python -asyncio
  8. 解决Picasso在Android 5.0以下版本不兼容https导致图片不显示
  9. [P2387魔法森林
  10. 工作中男女程序员对比,没注意原来差距这么大!你中招了吗?