项目中经常用到开发webservice接口,及调用webService接口。这里讲解如何使用cxf开发webService接口。
webservice介绍及理解
webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互。
比如,平台平台淘宝、京东想获取其他快递公司数据接口,需快递公司开放数据接口。
那么 webservice就是出于以上类似需求而定义出来的规范;无需关心对方什么平台上开发以及使用何种语言开发。
只关心调用对方发布webservice接口的一些对我们获取有用数据的方法。
开发人员一般就是在具体平台开发webservice接口,以及调用webservice接口;每种开发语言都有自己的webservice实现框架。
比如Java 就有 Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasyd等等…
其中CXF是java开发webService的一种实现框架技术。目前,CXF也是主流的webService实现框架。
使用cxf开发需引入cxf开发相关jar包,maven项目中pom.xml配置如下:
<!--添加cxf支持 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.9</version>
</dependency>
如果是其他方式,只需要加入CXF的jar包即可,下载地址如下:http://cxf.apache.org/download.html
定义场景:
公司有两个系统A和B,现在需要把A系统的用户数据推送给B系统,B系统在根据业务需要进行业务操作,操作完成再返回给A系统结果。
分析场景得出:A系统为发送数据方(即客户端),B系统为接收方(即服务端)
服务端需要定义一个接口,并且实现,代码如下:
@WebService
public interface WebInterface {
String HandleData(String data);
}
本示例简历简单接口,参数是String ,返回类型为String
实现类如下:
public class WebInterfaceImpl implements WebInterface {
@Override
public String HandleData(String data) {
// TODO Auto-generated method stub
return "服务端返回了:"+data;
}
}
@WebService注解: 实现 Web Service 的 Java 类必须指定 @WebService 或 @WebServiceProvider 注释。不能同时提供这两种注释。这个是必须指定的。
接下来则是发布WSDL
/import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.it.web.webInterface.WebInterface;
import com.it.web.webInterface.WebInterfaceImpl;
/**
* 本类发布一个wsdl总地址
* @author Administrator
*
*/
public class webservice {
//第一种使用通过JAX-WS提供的Endpoint来发布webservice
public void Server1() throws Exception {
System.out.println("启动weservice接口发布");
WebInterface implementor = new WebInterfaceImpl();
//发布地址以及端口参数
String address = "http://127.0.0.1:8080/helloWorld";
//发布
Endpoint.publish(address, implementor);
System.out.println("发布成功,发布地址为:"+address);
}
//通过CXF提供的JaxWsServerFactoryBean来发布webservice
public void Server2() throws Exception {
System.out.println("开始发布");
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
//对外暴露的接口类
factory.setServiceClass(WebInterfaceImpl.class);
//对外暴露地址
factory.setAddress("http://127.0.0.1:8080/webCXF");
//创建
org.apache.cxf.endpoint.Server server = factory.create();
//启动
server.start();
System.out.println("发布成功:http://127.0.0.1:8080/webCXF");
}
public static void main(String[] args) {
//测试
webservice webservice = new webservice();
try {
webservice.Server2();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
以上就是发布webservice的WDSL的两种方式。
运行main方法,现在访问:http://127.0.0.1:8080/webCXF?wsdl
出现如下
这个就是发布的wsdl了。
wsdl就是用来描述webservices提供的服务,相当与告诉别人你这个接口的详细参数、接口名称,返回参数类型等等信息。
接下来我们来看看客户端是如何编写的。
代码如下:
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import com.it.web.webInterface.WebInterfaceImpl;
public class cxfClient {
//直接调用
public void getCXFInfoStatis(){
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
jaxWsServerFactoryBean.setAddress("http://127.0.0.1:8080/webCXF?wsdl");
jaxWsServerFactoryBean.setServiceClass(WebInterfaceImpl.class);
WebInterfaceImpl w =(WebInterfaceImpl) jaxWsServerFactoryBean.create();
String str = w.HandleData("客户端发送请求");
System.out.println(str);
}
//动态调用
public void getCXFInfo(){
JaxWsDynamicClientFactory f = JaxWsDynamicClientFactory.newInstance();
Client c = f.createClient("http://127.0.0.1:8080/webCXF?wsdl");
try {
//invoke(调用地址的方法名,发送参数);
Object [] objects = c.invoke("HandleData", "ssss");
System.out.println("返回长度:"+objects.length);
if(objects.length>0){
System.out.println("返回内容为:"+objects[0].toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
cxfClient cxfClient = new cxfClient();
cxfClient.getCXFInfo();
}
}
不推荐直接调用,因为直接调用的话,你需要吧wsdl保存文件,在解析成服务端的实现类啥的,比较麻烦。
推荐直接使用第二种动态解析wsdl。
至此,cxf的客户端和服务端已经编写完毕。
一般在实际开发过程中,也差不多是这样的流程。
如果您在现有的项目中,使用非maven方式,可能会引起jar包冲突。