RPC(Axis2)方式调用WebService通用类

13 篇文章 0 订阅
13 篇文章 0 订阅

SpringBoot添加Axis2依赖

     <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-kernel</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-ant-plugin</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-corba</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-jaxws</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-spring</artifactId>
            <version>1.7.9</version>
        </dependency>

工具类:此工具类可直接访问wsdl的方法,包括头信息的添加以及请求参数和响应值的通用封装。

package org.springblade.common.utils;


import com.alibaba.fastjson.JSONObject;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.rpc.client.RPCServiceClient;
import javax.wsdl.Definition;
import javax.wsdl.WSDLException;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.xml.namespace.QName;
import java.lang.reflect.Type;
import java.util.*;


/**
 * RPC方式调用webservice接口用具类
 * Created by POlaris on 2022/05/11
 */
public class WebServiceUtils {

	private static WebServiceUtils instance = new WebServiceUtils();

	public WebServiceUtils() {
	}

	public static WebServiceUtils getInstance(){
		return instance;
	}

	/***
	 * 将HashMap转换为JavaBean的通用方法
	 * @param hashMap 要转换的HashMap
	 * @param t 实体类对象
	 * @param <T> 实体类
	 * @return
	 */
	public <T> T convertMapToJavaObject(HashMap<String, String> hashMap, T t) {
		String json = JSONObject.toJSONString(hashMap);
		return JSONObject.parseObject(json, (Type) t.getClass());
	}


	/**
	 * 添加头信息
	 *
	 * @param url      wsdl地址
	 * @param username 用户名
	 * @param password 密码
	 * @param company  公司号
	 * @return
	 * @throws AxisFault
	 * @throws WSDLException
	 */
	public RPCServiceClient addAuth(String url, String username, String password, String company) throws AxisFault, WSDLException {
		// 使用RPC方式调用WebService
		RPCServiceClient serviceClient = new RPCServiceClient();
		// 指定调用WebService的URL
		serviceClient.setTargetEPR(new EndpointReference(url));
		//添加头信息
		OMElement head = addHeader(username, password, company);
		serviceClient.addHeader(head);
		return serviceClient;
	}

	/**
	 * 请求响应封装(单个实体)
	 *
	 * @param serviceClient RPCServiceClient
	 * @param url           wsdl地址
	 * @param methodName    方法名
	 * @param entityName    实体名
	 * @param requestParams 请求参数
	 * @return
	 * @throws Exception
	 */
	public HashMap<String, String> request(RPCServiceClient serviceClient, String url, String methodName, String entityName, HashMap<String, String> requestParams) throws Exception {

		OMElement method = setParams(url, methodName, entityName, requestParams);
		OMElement element = serviceClient.sendReceive(method);
		return getResult(element);
	}

	/**
	 * 请求响应封装(单个实体)
	 *
	 * @param serviceClient RPCServiceClient
	 * @param url           wsdl地址
	 * @param methodName    方法名
	 * @param requestParams 请求参数
	 * @return
	 * @throws Exception
	 */
	public HashMap<String, String> request(RPCServiceClient serviceClient, String url, String methodName, HashMap<String, String> requestParams) throws Exception {

		OMElement method = setParams(url, methodName, getWsdlEntityName(url), requestParams);
		OMElement element = serviceClient.sendReceive(method);
		return getResult(element);
	}

	/**
	 * 请求响应封装(多个实体)
	 *
	 * @param serviceClient
	 * @param url           wsdl地址
	 * @param methodName    方法名
	 * @param entityName    实体名
	 * @param list          请求参数集合
	 * @return
	 * @throws Exception
	 */
	public List<HashMap> request(RPCServiceClient serviceClient, String url, String methodName, String entityName, List<HashMap> list) throws Exception {
		OMElement method = setParams(url, methodName, entityName, list);
		OMElement element = serviceClient.sendReceive(method);
		return getResultList(element);
	}

	/**
	 * 请求响应封装(多个实体)
	 *
	 * @param serviceClient
	 * @param url           wsdl地址
	 * @param methodName    方法名
	 * @param list          请求参数集合
	 * @return
	 * @throws Exception
	 */
	public List<HashMap> request(RPCServiceClient serviceClient, String url, String methodName, List<HashMap> list) throws Exception {
		OMElement method = setParams(url, methodName, getWsdlEntityName(url), list);
		OMElement element = serviceClient.sendReceive(method);
		return getResultList(element);
	}

	/**
	 * 请求响应封装(一个主表多个子表)
	 *
	 * @param serviceClient
	 * @param url           wsdl地址
	 * @param methodName    方法名
	 * @param entityName    实体名
	 * @param tableHead     表头信息
	 * @param tableBody     表体信息
	 * @return
	 * @throws Exception
	 */
	public HashMap<String, Object> request(RPCServiceClient serviceClient, String url, String methodName, String entityName, HashMap<String, String> tableHead, List<HashMap> tableBody) throws Exception {
		OMElement method = setParams(url, methodName, entityName, tableHead, tableBody);
		OMElement element = serviceClient.sendReceive(method);
		return getHeadAndBodyResult(element);
	}


	/**
	 * 请求响应封装(一个主表多个子表)
	 *
	 * @param serviceClient
	 * @param url           wsdl地址
	 * @param methodName    方法名
	 * @param tableHead     表头信息
	 * @param tableBody     表体信息
	 * @return
	 * @throws Exception
	 */
	public HashMap<String, Object> request(RPCServiceClient serviceClient, String url, String methodName, HashMap<String, String> tableHead, List<HashMap> tableBody) throws Exception {
		OMElement method = setParams(url, methodName, getWsdlEntityName(url), tableHead, tableBody);
		OMElement element = serviceClient.sendReceive(method);
		return getHeadAndBodyResult(element);
	}

	/**
	 * 将响应结果转为HashMap
	 *
	 * @param element
	 * @return
	 */
	public HashMap<String, String> getResult(OMElement element) {
		HashMap<String, String> resultMap = new HashMap<>();
		Iterator<OMElement> it = element.getFirstElement().getFirstElement().getFirstElement().getChildren();
		while (it.hasNext()) {
			OMElement om = it.next();
			resultMap.put(om.getLocalName(), om.getText());
		}
		return resultMap;
	}

	/**
	 * 将响应结果转为List,适用于多个结果集
	 *
	 * @param element
	 * @return
	 */
	public List<HashMap> getResultList(OMElement element) {
		List<HashMap> list = new ArrayList<>();
		Iterator<OMElement> it = element.getFirstElement().getFirstElement().getChildren();
		//多个实体
		while (it.hasNext()) {
			OMElement next = it.next();
			//迭代属性
			Iterator<OMElement> attributes = next.getChildren();
			HashMap<String, String> resultMap = new HashMap<>();
			while (attributes.hasNext()) {
				OMElement om = attributes.next();
				resultMap.put(om.getLocalName(), om.getText());
			}
			list.add(resultMap);
		}
		return list;
	}

	/**
	 * 将响应结果转为HashMap,适用用头和体请求方法的返回值
	 * 头信息Key: head,体信息key:body
	 *
	 * @param element
	 * @return
	 */
	public HashMap<String, Object> getHeadAndBodyResult(OMElement element) {
		HashMap<String, Object> headAndBodyMap = new HashMap<>();
		HashMap<String, String> resultMap = new HashMap<>();
		Iterator<OMElement> it = element.getFirstElement().getFirstElement().getFirstElement().getChildren();
		List<HashMap> list = new ArrayList<>();
		while (it.hasNext()) {
			OMElement om = it.next();
			//子节点
			if (om.getLocalName().equals("Component")) {
				Iterator<OMElement> componentAttributes = om.getChildren();
				HashMap<String, String> componentMap = new HashMap<>();
				while (componentAttributes.hasNext()) {
					OMElement attribute = componentAttributes.next();
					componentMap.put(attribute.getLocalName(), attribute.getText());
				}
				list.add(componentMap);
			} else {
				resultMap.put(om.getLocalName(), om.getText());
			}
		}
		headAndBodyMap.put("head", resultMap);
		headAndBodyMap.put("body", list);
		return headAndBodyMap;
	}

	/***
	 * 设置请求参数(单个实体)
	 * @param url wsdl地址
	 * @param methodName  方法名
	 * @param entityName  实体名
	 * @param hashMap 参数列表
	 * @return
	 */
	public OMElement setParams(String url, String methodName, String entityName, HashMap<String, String> hashMap) throws WSDLException {
		OMFactory fac = OMAbstractFactory.getOMFactory();
		OMNamespace omNs = fac.createOMNamespace(getTargetNamespace(url), "");
		OMElement method = fac.createOMElement(methodName, omNs);
		OMElement createRequest = fac.createOMElement("CreateRequest", null);
		OMElement dataAreaOm = fac.createOMElement("DataArea", null);

		OMElement entity = fac.createOMElement(entityName, null);
		for (Map.Entry<String, String> entry : hashMap.entrySet()) {
			OMElement element = fac.createOMElement(entry.getKey(), null);
			element.setText(entry.getValue());
			entity.addChild(element);
		}
		dataAreaOm.addChild(entity);
		createRequest.addChild(dataAreaOm);
		method.addChild(createRequest);
		method.build();
		return method;
	}

	/***
	 * 设置请求参数(多个实体)
	 * @param url wsdl地址
	 * @param methodName  方法名
	 * @param entityName  实体名
	 * @param list 参数列表
	 * @return
	 */
	public OMElement setParams(String url, String methodName, String entityName, List<HashMap> list) throws WSDLException {
		OMFactory fac = OMAbstractFactory.getOMFactory();
		OMNamespace omNs = fac.createOMNamespace(getTargetNamespace(url), "");
		OMElement method = fac.createOMElement(methodName, omNs);
		OMElement createRequest = fac.createOMElement("CreateRequest", null);
		OMElement dataAreaOm = fac.createOMElement("DataArea", null);
		for (HashMap<String, String> hashMap : list) {
			OMElement entity = fac.createOMElement(entityName, null);
			for (Map.Entry<String, String> entry : hashMap.entrySet()) {
				OMElement element = fac.createOMElement(entry.getKey(), null);
				element.setText(entry.getValue());
				entity.addChild(element);
			}
			dataAreaOm.addChild(entity);
		}
		createRequest.addChild(dataAreaOm);
		method.addChild(createRequest);
		method.build();
		return method;
	}


	/***
	 * 设置请求参数(一个主表,多个子表<一单多行>)
	 * @param url wsdl地址
	 * @param methodName  方法名
	 * @param entityName  实体名
	 * @param hashMap 参数列表
	 * @return
	 */
	public OMElement setParams(String url, String methodName, String entityName, HashMap<String, String> hashMap, List<HashMap> list) throws WSDLException {
		OMFactory fac = OMAbstractFactory.getOMFactory();
		OMNamespace omNs = fac.createOMNamespace(getTargetNamespace(url), "");
		OMElement method = fac.createOMElement(methodName, omNs);
		OMElement createRequest = fac.createOMElement("CreateRequest", null);
		OMElement dataAreaOm = fac.createOMElement("DataArea", null);

		OMElement entity = fac.createOMElement(entityName, null);
		for (Map.Entry<String, String> entry : hashMap.entrySet()) {
			OMElement element = fac.createOMElement(entry.getKey(), null);
			element.setText(entry.getValue());
			entity.addChild(element);
		}
		//多个子表行
		for (HashMap<String, String> map : list) {
			OMElement component = fac.createOMElement("Component", null);
			for (Map.Entry<String, String> entry : map.entrySet()) {
				OMElement element = fac.createOMElement(entry.getKey(), null);
				element.setText(entry.getValue());
				component.addChild(element);
			}
			entity.addChild(component);
		}
		dataAreaOm.addChild(entity);
		createRequest.addChild(dataAreaOm);
		method.addChild(createRequest);
		method.build();
		return method;
	}

	/***
	 *  添加Soap Header信息
	 * @param username 用户名
	 * @param password 密码
	 * @param company 公司
	 * @return
	 * @throws WSDLException
	 */
	public OMElement addHeader(String username, String password, String company) throws WSDLException {
		OMFactory omFactory = OMAbstractFactory.getOMFactory();
		OMElement head = omFactory.createOMElement("Activation", null);
		OMElement usernameElement = omFactory.createOMElement("username", null);
		usernameElement.setText(username);
		OMElement passwordElement = omFactory.createOMElement("password", null);
		passwordElement.setText(password);
		OMElement companyElement = omFactory.createOMElement("company", null);
		companyElement.setText(company);
		head.addChild(usernameElement);
		head.addChild(passwordElement);
		head.addChild(companyElement);
		return head;
	}

	/***
	 * 获取指定wsdl的targetNamesapce
	 * @param url
	 * @return
	 */
	public String getTargetNamespace(String url) throws WSDLException {
		WSDLFactory factory = null;
		factory = WSDLFactory.newInstance();
		WSDLReader reader = factory.newWSDLReader();
		reader.setFeature("javax.wsdl.verbose", true);
		reader.setFeature("javax.wsdl.importDocuments", true);
		Definition def = reader.readWSDL(url);
		String namespaceURI = def.getTargetNamespace();
		System.out.println("targetnamesapce:" + namespaceURI);
		return namespaceURI;

	}

	/**
	 * 获取指定wsdl的E实体名
	 * @param url
	 * @return
	 * @throws WSDLException
	 */
	public String getWsdlEntityName(String url) throws WSDLException {
		WSDLFactory factory = WSDLFactory.newInstance();
		WSDLReader reader = factory.newWSDLReader();
		reader.setFeature("javax.wsdl.verbose", true);
		reader.setFeature("javax.wsdl.importDocuments", true);
		Definition def = reader.readWSDL(url);
		QName qname = def.getQName();
		return qname.getLocalPart();
	}

}

 使用 示例:

package org.springblade.common.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.axis2.rpc.client.RPCServiceClient;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WebServiceDemo {
	public static void main(String[] args) {
		WebServiceDemo demo = new WebServiceDemo();
		demo.testSimpleData();
		demo.testSimpleMultiData();
		demo.testSendComplexData();
	}

	public void testSimpleData()
	{
		String url = "http://192.168.2.68:8312/c4ws/services/TransferOrder/test?wsdl";
		try {
			RPCServiceClient serviceClient = WebServiceUtils.getInstance().addAuth(url,"zhuyi", "Admin1888", "150");
			//请求参数
			HashMap<String, String> hashMap = new HashMap<>();
			hashMap.put("wwid", "ww008811");
			hashMap.put("wstp", "0001");
			hashMap.put("otbp", "205xxx1927");
			hashMap.put("item", "89xxx14234");
			hashMap.put("qoor", "55");

			HashMap<String,String> resultMap =  WebServiceUtils.getInstance().request(serviceClient,url,"create","TransferOrder",hashMap);
			for (Map.Entry<String, String> entry : resultMap.entrySet()) {
				System.out.println(entry.getKey() + "::" + entry.getValue());
			}
			TransferOrder  transferOrder = WebServiceUtils.getInstance().convertMapToJavaObject(resultMap,new TransferOrder());
			System.out.println("KKKK:"+transferOrder.getWwid());
		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}

	public void testSimpleMultiData()
	{
		String url = "http://192.168.2.68:8312/c4ws/services/TransferOrder/test?wsdl";
		try {
			RPCServiceClient serviceClient = WebServiceUtils.getInstance().addAuth(url,"zhuyi", "Admin1888", "150");
			List<HashMap> list = new ArrayList<>();
			//请求参数
			HashMap<String, String> hashMap = new HashMap<>();
			hashMap.put("wwid", "ww008802");
			hashMap.put("wstp", "0001");
			hashMap.put("otbp", "2050xx927");
			hashMap.put("item", "8980xxx14234");
			hashMap.put("qoor", "55");
			list.add(hashMap);

			hashMap = new HashMap<>();
			hashMap.put("wwid", "ww008803");
			hashMap.put("wstp", "0002");
			hashMap.put("otbp", "205bb01927");
			hashMap.put("item", "898bbb2314234");
			hashMap.put("qoor", "44");
			list.add(hashMap);

			//HashMap<String, String> resultMap = request(serviceClient,url,"create","TransferOrder",hashMap);
			List<HashMap> resultList =  WebServiceUtils.getInstance().request(serviceClient,url,"create","TransferOrder",list);
			for(HashMap<String, String> resultMap : resultList)
			{
				for (Map.Entry<String, String> entry : resultMap.entrySet()) {
					System.out.println(entry.getKey() + "::" + entry.getValue());
				}
				//String json = JSONObject.toJSONString(resultMap);
				//TransferOrder transferOrder =  JSONObject.parseObject(json,TransferOrder.class);
				TransferOrder  transferOrder = WebServiceUtils.getInstance().convertMapToJavaObject(resultMap,new TransferOrder());
				System.out.println("KKKK:"+transferOrder.getWwid());
			}



		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}

	public void testSendComplexData()
	{
		String url = "http://192.168.2.68:8312/c4ws/services/ProjectContract/test?wsdl";
		try {
			RPCServiceClient serviceClient =  WebServiceUtils.getInstance().addAuth(url, "zhuyi", "Admin1888", "150");
			List<HashMap> list = new ArrayList<>();
			//请求参数 表头
			HashMap<String, String> headMap = new HashMap<>();
			headMap.put("Guid", "W00014");
			headMap.put("TransDate", "2022-05-12T00:00:00.000+08:00");
			headMap.put("WanweiPijiadan", "1234");
			headMap.put("BusinessPartner", "851ee0053");
			headMap.put("ProjectBP", "1234");
			headMap.put("DocumentType", "1");
			headMap.put("ContractDate", "2022-05-12T00:00:00.000+08:00");
			headMap.put("EffectDate", "2022-05-11T00:00:00.000+08:00");
			headMap.put("ExpireDate", "2022-05-31T00:00:00.000+08:00");
			headMap.put("Project", "abc0001");
			HashMap<String, String> hashMap = new HashMap<>();
			//表体
			hashMap = new HashMap<>();
			hashMap.put("Guid", "ww008898");
			hashMap.put("WanweiLineID", "1");
			hashMap.put("LineNo", "1");
			hashMap.put("ItemCode", "301cc12");
			hashMap.put("TransDate", "2022-05-12T00:00:00.000+08:00");
			hashMap.put("Price", "55");
			hashMap.put("Quantity", "44");
			list.add(hashMap);

			hashMap = new HashMap<>();
			hashMap.put("Guid", "ww008899");
			hashMap.put("WanweiLineID", "1");
			hashMap.put("LineNo", "1");
			hashMap.put("ItemCode", "301ee12");
			hashMap.put("TransDate", "2022-05-12T00:00:00.000+08:00");
			hashMap.put("Price", "22");
			hashMap.put("Quantity", "33");
			list.add(hashMap);

			//HashMap<String, String> resultMap = request(serviceClient,url,"create","TransferOrder",hashMap);
			HashMap<String, Object> result =  WebServiceUtils.getInstance().request(serviceClient, url, "create",  headMap, list);
			HashMap<String, String> resultHead = (HashMap<String, String>) result.get("head");
			for (Map.Entry<String, String> entry : resultHead.entrySet()) {
				System.out.println("头:" + entry.getKey() + "::" + entry.getValue());
			}

			List<HashMap<String, String>> resultList = (List<HashMap<String, String>>) result.get("body");
			for (HashMap<String, String> resultMap : resultList) {
				for (Map.Entry<String, String> entry : resultMap.entrySet()) {
					System.out.println("体:" + entry.getKey() + "::" + entry.getValue());
				}
				String json = JSONObject.toJSONString(resultMap);
				TransferOrder transferOrder = JSONObject.parseObject(json, TransferOrder.class);
				System.out.println("KKKK:" + transferOrder.getWwid());
			}


		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
}

工具类自动生成的请求Body如下图所示

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上善若水_厚德载物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值