本章讲解使用CXF操作WebService具体步骤
1.概念
我们知道,在前面的学习中,我们通过原生的JDK使用命令将远程的webService转化为我们使用的Java代码。
那么我们想象一下,如果对方把实现的方法改了怎么办,我们还要重新去下载?
使用原始的方法固然会遇到这个问题。所以我们需要用到CXF。
Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
2.准备工作
使用CXF需要导入相关的jar包,如果你在使用maven,那么可以导入如下的依赖:
如果你不是使用的maven,那么可能有点难受,需要导入下面这一大堆jar包:
3.编写测试
1)本次测试的网址为:http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
该网址到作用在于根据输入的QQ号码可以检测QQ是否在线!
2)编写测试类如下
package cn.edu.ccut.test; import javax.xml.namespace.QName; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.junit.Test; public class WebServiceTest { @Test public void testWebService(){ JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); Client client = clientFactory.createClient("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"); Object[] result = null; try { //如果有命名空间的话 QName operationName = new QName("http://WebXml.com.cn/","qqCheckOnline"); //如果有命名空间需要加上这个,第一个参数为命名空间名称,第二个参数为WebService方法名称 result = client.invoke(operationName,"1462171547");//后面为WebService请求参数数组 System.out.println(result[0]); } catch (Exception e) { e.printStackTrace(); } } }
测试效果如下:
可见,当前的QQ处于在线的状态。