使用axis调用WebService,Java WebService调用工具类
Posted 微枫Micromaple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用axis调用WebService,Java WebService调用工具类相关的知识,希望对你有一定的参考价值。
文章目录
WebService 简介
概述
能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据 WebService
规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。
也就是说可以实现多语言、跨平台数据交互。
使用 axis 调用 WebService
引入依赖
pom.xml
依赖如下:
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-wsdl4j</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
</dependency>
WebService 调用工具类
package com.micromaple.common.utils;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.types.Schema;
import org.apache.commons.collections.MapUtils;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* WebService - 工具类
* Title: WebServiceUtils
* Description:
*
* @author Micromaple
* @version 1.0.0
* @date 2022/7/1 12:14
*/
@Slf4j
public class WebServiceUtils
// 接口调用地址
private static String url = "http://127.0.0.1:8080/webservice.asmx";
// 命名空间
private static String namespace = "http://tempuri.org/";
/**
* WebService - 调用接口
*
* @param methodName 函数名
* @param params 参数
* @param clazz 返回对象class
* @return 返回结果(Object)
*/
public static <T> T call(String methodName, Map<String, String> params, Class<T> clazz)
// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));
String soapActionURI = namespace + methodName;
try
Service service = new Service();
SOAPHeaderElement header = new SOAPHeaderElement(namespace, methodName);
header.setNamespaceURI(namespace);
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(namespace, methodName));
// 添加参数
List<String> parameterList = Lists.newArrayList();
if (params != null)
Set<String> paramsKey = params.keySet();
for (String key : paramsKey)
call.addParameter(new QName(namespace, key), XMLType.XSD_STRING, ParameterMode.IN);
String pValue = MapUtils.getString(params, key);
header.addChildElement(key).setValue(pValue);
parameterList.add(pValue);
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);
call.addHeader(header);
// 进行序列化 实体类也要序列化 implements Serializable
call.registerTypeMapping(clazz, new QName(namespace, soapActionURI),
new BeanSerializerFactory(clazz, new QName(namespace, soapActionURI)),
new BeanDeserializerFactory(clazz, new QName(namespace, soapActionURI)));
// 设置输出的类
call.setReturnClass(clazz);
// 接口返回结果
T result = (T) call.invoke(parameterList.toArray());
log.info("调用 WebService 接口返回===>" + result);
return result;
catch (Exception e)
log.error("调用 WebService 接口错误信息==>" + e.getMessage());
return null;
/**
* WebService - 接口调用
*
* @param methodName 函数名
* @param params 参数
* @return 返回结果(String)
*/
public static String call(String methodName, Map<String, String> params)
// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));
String soapActionURI = namespace + methodName;
try
Service service = new Service();
SOAPHeaderElement header = new SOAPHeaderElement(namespace, methodName);
header.setNamespaceURI(namespace);
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(namespace, methodName));
// 添加参数
List<String> parameterList = Lists.newArrayList();
if (params != null)
Set<String> paramsKey = params.keySet();
for (String key : paramsKey)
call.addParameter(new QName(namespace, key), XMLType.XSD_STRING, ParameterMode.IN);
String pValue = MapUtils.getString(params, key);
header.addChildElement(key).setValue(pValue);
parameterList.add(pValue);
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);
call.addHeader(header);
// 设置返回类型
call.setReturnType(new QName(namespace, methodName), String.class);
// 接口返回结果
String result = (String) call.invoke(parameterList.toArray());
log.info("调用 WebService 接口返回===>" + result);
return result;
catch (Exception e)
log.error("调用 WebService 接口错误信息==>" + e.getMessage());
return null;
/**
* WebService - 调用接口
*
* @param methodName 函数名
* @param params 参数
* @return 返回结果(String)
*/
public static String call2(String methodName, Map<String, String> params)
// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));
String soapActionURI = namespace + methodName;
try
Service service = new Service();
SOAPHeaderElement header = new SOAPHeaderElement(namespace, methodName);
header.setNamespaceURI(namespace);
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(namespace, methodName));
// 添加参数
List<String> parameterList = Lists.newArrayList();
if (params != null)
Set<String> paramsKey = params.keySet();
for (String key : paramsKey)
call.addParameter(new QName(namespace, key), XMLType.XSD_STRING, ParameterMode.IN);
String pValue = MapUtils.getString(params, key);
header.addChildElement(key).setValue(pValue);
parameterList.add(pValue);
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);
call.addHeader(header);
// 设置返回类型
call.setReturnType(XMLType.XSD_SCHEMA);
// 接口返回结果
Schema schemaResult = (Schema)call.invoke(parameterList.toArray());
String result = "";
for(int i = 0; i<schemaResult.get_any().length; i++)
result = result + schemaResult.get_any()[i];
log.error("调用 WebService 接口返回===>" + result);
return result;
catch (Exception e)
log.error("调用 WebService 接口错误信息==>" + e.getMessage());
return null;
- 第一个方法为返回对象的方式,区别在于需要定义返回对象,属性值需要跟
WebService
中的返回对象保持一致。 - 第二个方法适用于调用
WebService
后,返回的值为String
类型。
参数详解:
methodName
:函数名。需要调用的 WebService
的函数名称。
params
:参数。调用 WebService
时需传入的参数。
java中使用axis发布和调用webService
工作中需要调用webService服务,这里记录一下如何在java中发布和调用webService。
需要的jar包:
webService服务端:
import javax.jws.WebMethod; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class MyWebService { //@WebMethod(exclude = true)注解用于在webService中排除某方法 @WebMethod(exclude = true) public String hello(String name) { System.out.println("hello:" + name); return "hello:" + name; } public String transcoding(String fileName, String fileId, String userId, String filePath, String newPath) { System.out.println("transcoding..."); System.out.println("fileName:" + fileName); System.out.println("fileId:" + fileId); System.out.println("userId:" + userId); System.out.println("filePath:" + filePath); System.out.println("newPath:" + newPath); String result = ""; result += "<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>"; result += "<root>"; result += "<hbzm>"; result += "<FileID>" + fileId + "</FileID>"; result += "<FileName>" + fileName + "</FileName>"; result += "<userid>" + userId + "</userid>"; result += "<filepath>" + filePath + "</filepath>"; result += "<newpath>" + newPath + "</newpath>"; result += "<result>ACK</result>"; result += "</hbzm>"; result += "</root>"; return result; } public static void main(String[] args) { /** * 参数1:服务的发布地址 参数2:服务的实现者 */ Endpoint.publish("http://localhost:8081/upload/transcoding", new MyWebService()); System.out.println("webservice start success"); } }
webService客户端:
import java.rmi.RemoteException; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class MyWebClient { public static void main(String[] args) { callTrans(); } public static void callHello() { try { // new 一个服务 Service sv = new Service(); // 创建一个call对象 Call call = (Call) sv.createCall(); // 设置要调用的接口地址 call.setTargetEndpointAddress("http://localhost:8081/upload/transcoding"); // 设置要调用的接口方法 call.setOperationName(new QName("http://webservice.xzh.com/", "hello")); // 设置参数,在设定参数时,不使用服务端定义的参数名,而是arg0~argN来定义 call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN); // 返回参数类型 call.setReturnType(XMLType.XSD_STRING); Object result = call.invoke(new Object[] { "jason" }); System.out.println(result); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } public static void callTrans() { try { // new 一个服务 Service sv = new Service(); // 创建一个call对象 Call call = (Call) sv.createCall(); // 设置要调用的接口地址 call.setTargetEndpointAddress("http://localhost:8081/upload/transcoding"); // 设置要调用的接口方法 call.setOperationName(new QName("http://webservice.xzh.com/", "transcoding")); // 设置参数,在设定参数时,不使用服务端定义的参数名,而是arg0~argN来定义 call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN); call.addParameter("arg1", XMLType.XSD_STRING, ParameterMode.IN); call.addParameter("arg2", XMLType.XSD_STRING, ParameterMode.IN); call.addParameter("arg3", XMLType.XSD_STRING, ParameterMode.IN); call.addParameter("arg4", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType(XMLType.XSD_STRING); //发送转码请求 String transResult = (String) call .invoke(new Object[] { "fileName", "fileIdTrans", "userId", "annexPathWithName", "basePath" }); //解析转码接口返回的xml报文 Document doc = DocumentHelper.parseText(transResult); Element root = doc.getRootElement(); Element e = root.element("hbzm"); System.out.println(e.elementText("result")); System.out.println(e.elementText("FileID")); System.out.println(e.elementText("FileName")); System.out.println(e.elementText("userid")); System.out.println(e.elementText("filepath")); System.out.println(e.elementText("newpath")); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
日志截图:
服务端:
客户端:
以上是关于使用axis调用WebService,Java WebService调用工具类的主要内容,如果未能解决你的问题,请参考以下文章
使用axis调用WebService,Java WebService调用工具类
java axis调用webservice,接口方法中的数组型参数应该怎么传参