webservice不生成代码的两种调用方式

       java调用webservice接口时通常情况下都是使用生成代码的形式调用。这种方式虽然开发简单粗暴但是如果对方是单机部署且多单位使用的应该就不能满足情况了,而且需要生成jar包加入到代码相对臃肿。本文介绍使用RPC和document方式调用,代码简洁灵活。直接上代代码示例:

     示例一:RPC

public String getData(String method){
    String result = "";
    try {
        // 使用RPC方式调用WebService
        RPCServiceClient serviceClient = new RPCServiceClient();
        String url = "http://xxxx/services/ldapService?wsdl"; //调用地址
        EndpointReference targetEPR = new EndpointReference(url);
        Options options = serviceClient.getOptions();
        options.setTo(targetEPR);
        options.setAction("http://gwjh.zjportal.net/invoke");
        String reqXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><invoke type=\"" + method + "\">"  //ldapSync
                + "<caller><sysid>"+unifiedPortalConfig.getGwjhSysId()+"</sysid><token>"+unifiedPortalConfig.getGwjhToken()+"</token><orgCode>"+unifiedPortalConfig.getGetGwjhOrgCode()+"</orgCode></caller><callbody>"
                + "<area>XXX\\XXX</area></callbody></invoke>";  //拼接参数
        Object[] parameters = new Object[] {reqXml};

        QName qname = new QName("http://xxxx.xxx.net/scheme/1.0", "invoke");

        // 调用方法 传递参数,调用服务,获取服务返回结果集
        OMElement element = serviceClient.invokeBlocking(qname, parameters);

        result = element.getFirstElement().getText();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        return result;
    }
}

示例二:document

public void work(T_MT_Domain mt_domain){
        String domain = mt_domain.getDomain();
        try {
            String url = "http://" + domain + "/WS/NewOrgServiceOld.asmx";
            String nameSpace = "http://sxt.com.cn/";
            String methodName = "QueryAllOUInfo";

            ServiceClient serviceClient = Axis2Util.getServiceClient(url, nameSpace, methodName);

            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace(nameSpace, "");
            OMElement method = fac.createOMElement(methodName, omNs);

            //添加参数
            Axis2Util.addInitParams(fac, omNs, method, unifiedPortalConfig.getSystemID(), unifiedPortalConfig.getAccount(), unifiedPortalConfig.getPassword());

            method.build();
            OMElement result = serviceClient.sendReceive(method);
            //判断返回值是否存在
            if(null == result){
                return;
            }

            List<Map<String,String>> list = new ArrayList<Map<String,String>>();

            OMElement outParam = OMElementUtil.getChildOmElement(result, "outParam");
            OMElement ouInfo = OMElementUtil.getChildOmElement(outParam, "ouInfo");

            Iterator iterator2 = ouInfo.getChildElements();
            while(iterator2.hasNext()){
                OMElement threeElement = (OMElement)iterator2.next();
                if("OUInfo".equals(threeElement.getLocalName())){
                    list.add(OMElementUtil.convertToMap(threeElement.getChildElements()));
                }
            }

            //输出获取到的数据集合 同步数据
            List<T_HR_Organization> syncList = new ArrayList<T_HR_Organization>();
            list.stream().forEach( m -> {
                T_HR_Organization organization = new T_HR_Organization();
                organization.setSynchronizedId(m.get("ouID"));
                organization.setFullName(StringUtils.isEmpty(m.get("ouFullName")) ? m.get("ouName") : m.get("ouFullName"));
                organization.setName(m.get("ouName"));                
                organization.setSyncDomain(domain);
                syncList.add(organization);
            });

            hr_organizationService.batchSave(syncList);
            logger.info("----同步----" + domain + "-org--成功--");
        } catch (Exception axisFault) {
            axisFault.printStackTrace();
            logger.info("----同步----" + domain + "-org--失败--");
        }
    }

参数构建工具类:

public class Axis2Util {

    /**
     * 创建service client
     * @param url
     * @param nameSpace
     * @param method
     * @return
     */
    public static ServiceClient getServiceClient(String url, String nameSpace, String method) throws Exception {
        ServiceClient serviceClient = null;
        Options options = new Options();
        EndpointReference targetEPR = new EndpointReference(url);
        options.setTo(targetEPR);
        options.setAction(nameSpace + method); //需要加上这条语句
        serviceClient = new ServiceClient();
        serviceClient.setOptions(options);
        return serviceClient;
    }

    /**
     * 构建参数
     * @param fac
     * @param omNs
     * @param method
     * @param paramKey
     * @param paramValue
     */
    public static void addParam(OMFactory fac, OMNamespace omNs, OMElement method, String paramKey, String paramValue){
        OMElement param = fac.createOMElement(paramKey, omNs);
        param.addChild(fac.createOMText(param, paramValue));
        method.addChild(param);
    }

    /**
     * 构建二级参数
     * @param fac
     * @param omNs
     * @param method
     * @param paramsKey 父参数的名称
     * @param childParams 子参数的Key-value
     */
    public static void addChildParams(OMFactory fac, OMNamespace omNs, OMElement method, String paramsKey, Map<String, String> childParams){
        OMElement param = fac.createOMElement(paramsKey, omNs);
        for (Map.Entry<String, String> entry : childParams.entrySet()){
            OMElement childParam = fac.createOMElement(entry.getKey(), omNs);
            childParam.addChild(fac.createOMText(childParam, entry.getValue()));
            param.addChild(childParam);
        }
        method.addChild(param);
    }

    /**
     * 构建二级参数
     * @param fac
     * @param omNs
     * @param method
     * @param paramsKey
     * @param childKey
     * @param childParams
     */
    public static void addChildParams(OMFactory fac, OMNamespace omNs, OMElement method, String paramsKey, String childKey, List<String> childParams){
        OMElement param = fac.createOMElement(paramsKey, omNs);
        for (String str : childParams){
            OMElement childParam = fac.createOMElement(childKey, omNs);
            childParam.addChild(fac.createOMText(childParam, str));
            param.addChild(childParam);
        }
        method.addChild(param);
    }


    /**
     * 初始化必备参数
     * @param fac
     * @param omNs
     * @param method
     * @param systemID
     * @param account
     * @param password
     */
    public static void addInitParams(OMFactory fac, OMNamespace omNs, OMElement method, String systemID, String account, String password){
        Axis2Util.addParam(fac, omNs, method, "systemID", systemID);
        Axis2Util.addParam(fac, omNs, method, "account", account);
        Axis2Util.addParam(fac, omNs, method, "password", password);
    }
}

 

返回节点解析工具类:

public class OMElementUtil {

    /**
     * 获取指定层级的 omElment
     * @param omElement
     * @param nodeName
     * @return
     */
    public static OMElement getChildOmElement(OMElement omElement, String nodeName){
        if(null == omElement){
            return null;
        }
        Iterator iterator = omElement.getChildElements();
        while(iterator.hasNext()){
            OMElement omElement1 = (OMElement)iterator.next();
            if(nodeName.equals(omElement1.getLocalName())){
                return omElement1;
            }
        }
        return null;
    }

    /**
     * OMElement节点转化成Map
     * @param iterator
     * @return
     */
    public static Map<String, String> convertToMap(Iterator iterator){
        Map<String, String> map = new HashMap<String, String>();
        while (iterator.hasNext()){
            OMElement omElement1 = (OMElement) iterator.next();
            map.put(omElement1.getLocalName(), omElement1.getText());
        }
        return map;
    }
}

以上两种方式都可用,有的webservice接口只能支持RPC方式。推荐使用document方式。如果对方的webservice接口支持http方式更好可能直接使用http方式调用。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章