前言
前不久,为客户开发的一个身份验证功能开发要用到Webservice,我是第一次接触Webservice的开发。
刚开始用CXF的方式去调用Webservice,成功了,但是部署到测试环境报错了,原因是CXF依赖与JDK的一个tool.jar,而测试环境使用的是JRE环境(JRE环境没有tool.jar这个jar包),因而CXF调用Webservice的方式行不通。于是,我又寻找了其它调用Webservice的方式进行尝试,AXIS、AXIS2,HttpClient,这三种方式都试过了,也踩了不少坑,最后使用HttpClient的方式解决了问题。
在此,我需要将这个踩坑过程记录,加深Webservice调用方式的知识点。
这次Webservice身份验证功能接口我一共使用了四种方式去调用,它们分别是:
(1)CXF方式。
(2)AXIS方式。
(3)AXIS2方式
(4)Http Client方式。
下面,对这四种调用方式进行介绍。可能某些方面介绍的不太齐全,但希望能大家能有所帮助。
首先看一下Webservice服务端的代码,这是一个非常简单的Webservice接口,方便理解Webservice调用的交互流程。
Webservice服务端代码
package com.chenlw.webservice;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
* Title: ServiceHello
* Description: 基于jdk1.6以上的javax.jws 发布webservice接口
*
* @author panchengming
* @WebService - 它是一个注解,用在类上指定将此类发布成一个ws。
* Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解
* 对象绑定到一个地址的端口上。
* Version:1.0.0
*/
@WebService
public class MyWebServiceTester {
public static String JWS_SERVER_URL = "http://192.168.174.1:9090/MyWebService/testWebService";
public static void main(String[] args) {
// 通过EndPoint(端点服务)发布一个WebService
// 发布成功后 在浏览器输入 http://192.168.174.1:9090/MyWebService/testWebService?wsdl
Endpoint.publish(JWS_SERVER_URL, new MyWebServiceTester());
System.out.println("发布成功!");
}
/**
* 供客户端调用方法 该方法是非静态的,会被发布
*
* @param param 传入参数
* @return String 返回结果
*/
public String testWebService(String param) {
return "Webservice接口返回数据:" + param;
}
}
代码运行后,在浏览器输入http://192.168.174.1:9090/MyWebService/testWebService?wsdl可以如下内容(这是WSDL,即基于XML语言的Web服务描述语言)。
1 CXF方式调用Webservice
1.1 CXF简介
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。【来源于:百度百科CXF】
1.2 CXF调用Webservice
测试代码:
package com.chenlw.webservice;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
/**
* @author chenlw 2019/10/02
*/
public class CxfClientTester {
public static final String SERVICE_URL = "http://192.168.174.1:9090/MyWebService/testWebService?wsdl";
public static final String METHOD_NAME = "testWebService";
public static void main(String[] args) {
try {
test1();
} catch (Exception e) {
System.out.println("ERROR:" + e.getMessage());
}
}
public static void test1() throws Exception {
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
Client client = clientFactory.createClient(SERVICE_URL);
Object[] result = client.invoke(METHOD_NAME, "hello");
System.out.println(result[0]);
}
}
运行结果: