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

使用CXF、Axis2调用WebService

发布时间:2020-12-16 21:58:11 所属栏目:安全 来源:网络整理
导读:? ? ? ? ? ? ? ?最近项目中又要调用其他系统的WebService,同时呢本项目也需要提供webService 服务,有几年没有用CXF 、Axis2 、xfire 这三个框架了,本来想写详细点,一回想这三个框架内容实在太多,所以这里简单写下CXF、Axis2调用WebService 吧! ? ? ? 关

? ? ? ?

? ? ? ?最近项目中又要调用其他系统的WebService,同时呢本项目也需要提供webService 服务,有几年没有用CXF 、Axis2 、xfire 这三个框架了,本来想写详细点,一回想这三个框架内容实在太多,所以这里简单写下CXF、Axis2调用WebService 吧!

? ? ? 关于CXF AXIS2 发布webService 在另外的博客在写吧!主要是想记录和给组里其他没用的 能够尽快上手!

? ? ?关于WebService 基本的概念介绍,这里就不累赘了,网上好多,原来做培训的时候写过相关文档,如果找到的话就上传到资源


? ? ?这里要说一个问题:就是好多人说 写的文章排版不好,这个实在抱歉,很多时候没有注意,同时呢时间确实不同,有的认为简单就没有在注意,非常抱歉!以后会注意?

? ? 最近在弄Spring Boot 和Spring Cloud ?,后面如果写好了会上传......

? ?

? ?Axis2 调用WebService有三种方式,如下:

??

? 首先需要下载axis2,我使用的是axis2-1.7.3,下载成功后解压即可

? ? 下载地址:http://axis.apache.org/axis2/java/core/

? ?第一种: 利用wsdl2java命令反向生成WebService 的相关类

? 命令如下:

? ?# cd D: axis2-1.7.3bin

? ?# wsdl2java.bat -uri http://113.119.4.5:XXXX/NiLockWebService.asmx?wsdl

? ?如天气接口

? # wsdl2java.bat-uri http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

? 操作成功后会在bin目录下生成一个src 文件夹

? 把src 文件夹下面的类拷贝到项目src下 ,有一个stub结尾的类 里面可以相关调用的方法名,soapAction、方法参数等等

?

? ? 调用代码如下:

? ? ? ? ? ?NLockWebServiceStub stub = new?NLockWebServiceStub();? //反向生成类

? ? ? ? ? //获取serviceClient 可以设置相关参数

??????? ??? ServiceClientserviceClient = stub._getServiceClient();

??????? ??? Optionsoptions = serviceClient.getOptions();

??????? ??? //options.setProperty(HTTPConstants.CHUNKED,Boolean.FALSE);

? ? ? ? ? ?//设置命令空间

??????? ??? options.setAction("http://microsoft.com/webservices/");

??????? ??? ?//实例化对应调用方法

??????????? GPRSCMD gprscmd = new GPRSCMD();

? ? ? ? ? //设置对应参数

??????????? gprscmd.setAccount(username);

??????????? gprscmd.setMd5(accPassword);

???????????gprscmd.setJsonStr(jsonStr);

? ? ? ? ?//调用返回结果

??????????String result =?stub.gPRSCMD(gprscmd).getGPRSCMDResult();

? ? ? ? ? System.out.println("result:"+result);

? ? ? 基本的调用如上,此方法是个人认为最不容易出错的方法,但是需要我们在项目加入相关代码,比如像我的项目里需要调用的webservice 比较多,同时还需要对外提供 ? ? webservice 服务,可能就需要加入很多代码了!

? ? ? 第二种: 使用RPC远程过程调用

? ? ? ? 代码如下:

? ? ? ? ? ?String url =" http://113.119.4.5:XXXX/NiLockWebService.asmx?wsdl ";

??? ??????????? RPCServiceClient client = newRPCServiceClient();?

??? ??????????? Options options = client.getOptions();?

??? ??????????? //可以设置HttpClient?

??? ?????????? /* MultiThreadedHttpConnectionManager connManager = newMultiThreadedHttpConnectionManager();

??? ???????????connManager.getParams().setSoTimeout(600*1000); //10

??? ???????????connManager.getParams().setConnectionTimeout(600*1000);

??? ??????????? HttpClient httpclient = newHttpClient(connManager);

??? ??????????? options.setProperty(HTTPConstants.CACHED_HTTP_CLIENT,httpclient );

??? ??????????? */

??? ??????????? EndpointReference endpoint = newEndpointReference(url);?

??? ??????????? options.setTo(endpoint);

??? ??????????? options.setProperty(HTTPConstants.CHUNKED,Boolean.FALSE);

??? ??????????? options.setAction("http://microsoft.com/webservices ");

??? ?????????? // options.setTimeOutInMilliSeconds(50000000L);

??? ?????????? // options.setProperty(HTTPConstants.,600000);

??? ?????????? // options.setProperty(HTTPConstants.SO_TIMEOUT,600*1000);

??? ??????????? options.setProperty(HTTPConstants.SO_TIMEOUT,600*1000);

??? ??????????? Object[] obj = new Object[]{username,acc,json};?

??? ??????????? //返回值类型

??? ??????????? Class<?>[] classes = new Class[] { String.class }; ??

??? ??????????? QName qname = new QName("http://microsoft.com/webservices/ ","GPRSCMD");???

??? ??????????? String result = (String)client.invokeBlocking(qname,obj,classes)[0];?

? ? ? ? ? ? ? System.out.println("result: "+result);?

??? ??????? }catch(AxisFault e){?

??? ??????????? e.printStackTrace();?

??? ??????? }?

? ? ? 如果没有返回值使用invokeRobust(opName,args) 方法

? ? ?此方法比第一种方式? 代码就要简洁很多,调用过程中需要注意参数问题,多个传递参数时候,服务端接收到到的参数顺序可能会发生变化,一定要注意,不然结果老是出错!


? ? 第三种: 使用document方式调用?

?????? Optionsoptions = newOptions();

?????? // 指定调用WebServiceURL

?????? EndpointReferencetargetEPR = newEndpointReference(url);

?????? options.setTo(targetEPR);

?????? options.setAction("http://microsoft.com/webservice");

?????? ServiceClientsender = newServiceClient();

?????? sender.setOptions(options);

?????? ?OMFactory omFactory = OMAbstractFactory.getOMFactory();?

???????? String tns = "http://microsoft.com/webservices ";?

???????? // 命名空间

???????? OMNamespace namespace =omFactory.createOMNamespace(tns, "");?

???????? //指定方法??

???????? OMElement method =omFactory.createOMElement("GPRSCMD",namespace);?

???????? //指定方法的参数?

???????? OMElement usernameElement? = omFactory.createOMElement("account",namespace);?

???????? usernameElement.setText(username);

???????? OMElement md5Element? = omFactory.createOMElement("md5",namespace);?

???????? md5Element.setText(accPassword);

???????? OMElement strElement? = omFactory.createOMElement("json",namespace);?

? ? ? ? ?strElement.setText(jsonStr);

???????? method.addChild(usernameElement);?

???????? method.addChild(md5Element);

???????? method.addChild(strElement);

???????? OMElement result =sender.sendReceive(method);?

????????System.out.println("result: "+ result);?


? ?CXF 调用WebService

? ? 下载cxf ?我使用的是apache-cxf-2.7.18

? ? 进入到bin 目录使用wsdl2java 命令生成对应类

? ? # wsdl2java.bat ?http://114.119.5.137:1001/NLockWebService.asmx?wsdl

? ? 执行成功后会在bin 目录下生成webservice 对应的包与类

? ? 与axis2 不同的是没有生成src 文件夹,同时cxf 会生成一堆类,如果用过cxf 编写过webservice 的都知道,cxf 生成的类看起来要比axis2 清楚很多

? ? 拷贝所有文件到项目src 下,同时需要导入cxf 相关jar

? ? soap 类是我们调用的入口类,里面定义了具体的每一个方法和方法需要的相关参数,cxf 保留了原来参数名等,axis2 方法名与实际方法名有些不同,需要注意


? ? ? ? //webservice 地址

?????? ?? String address = "http://113.119.4.5:XXXX/NiLockWebService.asmx?wsdl";

?????? ?? //

?????? ?? JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();

?????? ?? bean.setAddress(address);

?????? ?? bean.setServiceClass(NLockWebServiceSoap.class);

?????? ? //bean.setEndpointName(endpointName);

?????? ? //bean.setWsdlLocation(wsdlURL);

?????? ?? NLockWebServiceSoap webServiceSoap =(NLockWebServiceSoap) bean.create();

?????? ?? //调用对应的方法

?????? ?? String result =webServiceSoap.gprscmd(username,accPassword,jsonStr);

?????? ?? System.out.println("result :"+result);

(编辑:李大同)

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

    推荐文章
      热点阅读