java 调用wsdl接口同时将返回数据解析成json

package com.haiersoft.ushequmobile.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.List;
import java.util.Map;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.log4j.Logger;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.xml.sax.InputSource;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class WSWorker
{

    private static Logger logger = Logger.getLogger(WSWorker.class.getName());

    /**
     * 返回JSONArray格式的结果
     *
     * params中如果同一个层次有重名元素,需要将重名元素放到list中,key不变,value使用新的list
     * @param prefix 方法前缀
     * @param methodName 方法名
     * @param ns 命名空间
     * @param params 参数
     * @param wsdl wsdl
     * @return
     * @throws SOAPException 生成soap报文时发生异常
     */
    public static JSONArray performRequest(String prefix, String methodName, String ns, Map<String, Object> params, String wsdl) throws SOAPException
    {
        return parseXML(getSOAPMessage(prefix, methodName, ns, params, wsdl));
    }

    /**
     *
     * @param prefix 方法前缀
     * @param methodName 方法名
     * @param ns 命名空间
     * @param params 参数
     * @param wsdl wsdl
     * @return
     * @throws SOAPException
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    private static String getSOAPMessage(String prefix, String methodName, String ns, Map<String, Object> params, String wsdl) throws SOAPException
    {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage message = messageFactory.createMessage();
        message.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");

        SOAPPart soapPart = message.getSOAPPart();// 创建soap部分
        SOAPEnvelope envelope = soapPart.getEnvelope();

        envelope.setAttribute("xmlns:" + prefix, ns);

        SOAPBody body = envelope.getBody();
        SOAPElement bodyElement = body.addChildElement(envelope.createName(methodName, prefix, ""));

        if (null != params)
        {
            for (Map.Entry<String, Object> entry : params.entrySet())
            {
                if (entry.getValue() instanceof Map)
                {
                    SOAPElement inputParam = bodyElement.addChildElement(entry.getKey());
                    addParams((Map<String, Object>)entry.getValue(), inputParam);
                }
                else if (entry.getValue() instanceof String)
                {
                    bodyElement.addChildElement(entry.getKey()).addTextNode((String)entry.getValue());
                }
                else if (entry.getValue() instanceof List)
                {
                    for(Object item : (List)entry.getValue())
                    {
                        SOAPElement inputParam = bodyElement.addChildElement(entry.getKey());

                        addParams((Map<String, Object>)item, inputParam);
                    }
                }
                else if (entry.getValue() instanceof Integer
                        || entry.getValue() instanceof Long
                        || entry.getValue() instanceof Double
                        || entry.getValue() instanceof Short
                        || entry.getValue() instanceof Float)
                {
                    bodyElement.addChildElement(entry.getKey()).addTextNode(String.valueOf(entry.getValue()));
                }
            }
        }

        message.saveChanges();

        String xmlString = "";
        try
        {
            xmlString = getXMLMessage(message);

//            logger.debug(xmlString);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return getResultFromWebService(xmlString, wsdl);
    }

    @SuppressWarnings("unchecked")
    private static void addParams(Map<String, Object> params, SOAPElement parentElement) throws SOAPException
    {
        if (null != params)
        {
            for (Map.Entry<String, Object> entry : params.entrySet())
            {
                if (entry.getValue() instanceof Map)
                {
                    SOAPElement element = parentElement.addChildElement(entry.getKey());
                    addParams((Map<String, Object>)entry.getValue(), element);
                }
                else if (entry.getValue() instanceof String)
                {
                    parentElement.addChildElement(entry.getKey()).addTextNode((String)entry.getValue());
                }
                else if (entry.getValue() instanceof List)
                {
                    for(Object item : (List)entry.getValue())
                    {
                        SOAPElement inputParam = parentElement.addChildElement(entry.getKey());

                        addParams((Map<String, Object>)item, inputParam);
                    }
                }
            }
        }
    }

    private static String getXMLMessage(SOAPMessage msg) throws SOAPException, IOException
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        msg.writeTo(baos);
        String str = baos.toString("utf-8");
        baos.close();
        return str;
    }

    /**
     * 请求WebService获取结果
     *
     * @param xml
     * @param endPoint
     * @return
     */
    private static String getResultFromWebService(String xml, String endPoint)
    {

        String result = "";

        // 创建连接实例
        PostMethod postMethod = new PostMethod(endPoint);
        try
        {
            byte[] b = xml.getBytes("utf-8");
            InputStream is = new ByteArrayInputStream(b, 0, b.length);
            RequestEntity re = new InputStreamRequestEntity(is, b.length, "text/xml; charset=utf-8");
            postMethod.setRequestEntity(re);
            HttpClient httpClient = new HttpClient();
            // 执行
            int statusCode = httpClient.executeMethod(postMethod);
            // 判断是否执行成功
            if (statusCode != HttpStatus.SC_OK)
            {
                logger.error("Method failed: " + postMethod.getStatusLine());
            }
            else
            {
                // 返回数据
                result = postMethod.getResponseBodyAsString();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            // 释放连接,无论执行方法是否成功,都必须释放连接。
            if (postMethod != null)
            {
                postMethod.releaseConnection();
            }
        }

//        logger.debug("结果:" + result);
        return result;
    }

    /**
     * 解析xml字符串
     *
     * @param xmlDoc
     *            调用wsdl返回的数据
     * @return 请求结果,如果网络连接失败,返回null
     */
    private static JSONArray parseXML(String xmlDoc)
    {
        JSONArray resultArray = null;
        StringReader read = new StringReader(xmlDoc);
        // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
        InputSource source = new InputSource(read);
        // 创建一个新的SAXBuilder
        SAXBuilder sb = new SAXBuilder();
        // List infoList = new ArrayList();
        try
        {
            // 通过输入源构造一个Document
            Document doc = sb.build(source);
            // 取的根元素
            Element root = doc.getRootElement();
            // 得到根元素所有子元素的集合
            // Namespace ns = root.getNamespace();
            List<Element> bodyList = root.getChildren();
            if (bodyList != null && bodyList.size() > 0)
            {
                Element body = (Element) bodyList.get(0);// Body
                List<Element> responses = body.getChildren();
                if (responses != null && responses.size() > 0)
                {
                    Element response = (Element) responses.get(0);
                    List<Element> results = response.getChildren();
                    if (results != null && results.size() > 0)
                    {
                        resultArray = new JSONArray();
                        for (int i = 0; i < results.size(); i++)
                        {
                            Element result = (Element) results.get(i);

                            resultArray.add(convertToJSONOrText(result));
                        }
                    }
                }

            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return resultArray;
    }

    private static Object convertToJSONOrText(Element item)
    {

        List<Element> elements = item.getChildren();

        if(elements.size() != 0)
        {
            JSONObject map = new JSONObject();
            for(Element element : elements)
            {
                int count = 0;
                String key = element.getName();
                //有些接口,返回的数据是重名的
                if(map.containsKey(key))
                {
                    count = getSameKeyCount(map, key);
                    if(0 != count)
                    {
                        if(1 == count)
                        {
                            key = element.getName() + "[email protected]@_start_" + count;
                        }
                        else
                        {
                            key = element.getName() + "[email protected]@_" + count;
                        }
                    }
                }

                map.put(key, convertToJSONOrText1(element));
            }
            map = reformatMap(map);

            return map;
        }
        else
        {
            return item.getText();
        }

    }

    private static Object convertToJSONOrText1(Element item)
    {

        List<Element> elements = item.getChildren();

        if(elements.size() != 0)
        {
            JSONObject map = new JSONObject();
            for(Element element : elements)
            {
                int count = 0;
                String key = element.getName();
                //有些接口,返回的数据是重名的
                if(map.containsKey(key))
                {
                    count = getSameKeyCount(map, key);
                    if(0 != count)
                    {
                        if(1 == count)
                        {
                            key = element.getName() + "[email protected]@_start_" + count;
                        }
                        else
                        {
                            key = element.getName() + "[email protected]@_" + count;
                        }
                    }
                }

                map.put(key, convertToJSONOrText1(element));
            }
            map = reformatMap(map);

            return map;
        }
        else
        {
            return item.getText();
        }

    }

    /**
     * map中以key为开始的条目数量
     * @param map
     * @return
     */
    private static int getSameKeyCount(JSONObject map, String key)
    {
        int count = 0;
        for(Map.Entry<String, Object> tmp : map.entrySet())
        {
            if(tmp.getKey().startsWith(key))
            {
                count++;
            }
        }
        return count;
    }

    /**
     * 将带索引的key对应的数据下移一层
     * @param map
     */
    private static JSONObject reformatMap(JSONObject map)
    {
        JSONObject result = new JSONObject();
        for(Map.Entry<String, Object> entry : map.entrySet())
        {
            //当前key还有后续带索引的数据
            String key = entry.getKey();

            if(map.containsKey(key+"[email protected]@_start_1"))
            {
                JSONArray array = new JSONArray();

                array.add(map.get(key));
                array.add(map.get(key+"[email protected]@_start_1"));

                int size = map.entrySet().size();
                for(int i=2; i<size; i++)
                {
                    Object object = map.get(key + "[email protected]@_" + i);
                    if(null != object)
                    {
                        array.add(object);
                    }
                }

                result.put(key, array);

            }
            else if(-1 == key.indexOf("[email protected]@_"))
            {
                result.put(key, entry.getValue());
            }
        }

        return result;
    }    

}

非原创,来源于项目工程

时间: 2024-10-19 08:24:34

java 调用wsdl接口同时将返回数据解析成json的相关文章

C#/Java 调用WSDL接口及方法

一.C#利用vs里面自带的"添加web引用"功能: 1.首先需要清楚WSDL的引用地址  如:http://www.webxml.com.cn/Webservices/WeatherWebService.asmx 2.在.Net项目中,添加web引用. 3.在弹出页面中,输入URL->点击点击绿色图标(前往)按钮->自定义引用名->点击添加引用 4.添加成功,查看类中可调用的方法: 5.在项目中,调用wsdl中的方法. [csharp] view plain copy

java调用wsdl接口

前提: ① 已经提供了一个wsdl接口 ② 该接口能正常调用 步骤1:使用cxf的wsdl2java工具生成本地类 下载CXF:http://cxf.apache.org/download.html 配置环境变量: CXF_HOME=E:\WebService\CXF\apache-cxf-2.1.1\apache-cxf-2.1.1 PATH后追加上“ ;%CXF_HOME%\bin” 验证:cmd命令行中输入wsdl2java,如果显示其用法表示配置好了. 运行命令 : wsdl2java 

将Array格式的数据解析成JSON格式的数据

在编程的过程中,数据的传输格式如何,会影响开发的效率和后期代码的维护, 并且现在许多的js中支持了JSON格式的数据, 比如angular.nodejs.本篇文章主要讲解Array(数组)形式数据的解析.其它格式的数据会在后续的文章中进行书写. (1)定义一个解析Array的类JSONArray. public class JSONArray { @SuppressWarnings("unchecked") public static String toJSONString(List

java调用webservice接口方法

webservice的 发布一般都是运用WSDL(web service descriptive language)文件的款式来发布的,在WSDL文件里边,包含这个webservice暴露在外面可供运用的接口.今日查找到了非常好的 webservice provider列表 http://www.webservicex.net/WCF/default.aspx 这上面列出了70多个包含许多方面的free webservice provider,utilities->global weather就

java调用飞信接口免费短信发送到对方手机

原文:java调用飞信接口免费短信发送到对方手机 源代码下载地址:http://www.zuidaima.com/share/1550463460084736.htm 飞信发送信息限(移动用户) 1.用飞信加为好友才可以跟对方发飞信(达到此条件发飞信不收取费用) 2.FetionConfig配置文件里的 WeekendGreetings=是发送另一个配置文件名 如 WeekendGreetings=周末问候 就是 周末问候 文件里的内容 每一行 就是一条飞信 phone=你的手机号码 pwd=你

C# 不添加WEB引用调用WSDL接口

在项目中添加WEB引用耦合度较高,更新时要更新引用,所以我建议不添加WEB引用调用WSDL接口,废话不多说,直接上代码 例如WSDL地址为:http://XXX.XX.XXX.XXX:9115/WsPortal/soap/ws?WSDL    需要调用execute方法  先查看描述文件参数 /// <summary> /// 需要WebService支持Post调用 /// </summary> public static XmlDocument QueryPostWebServ

SpringMVC3.2 解决PO返回前台转成JSON时数据Long精度丢失问题

SpringMVC3.2  解决PO返回前台转成JSON时数据Long精度丢失问题 方案 1.自定义一个杰克逊的json转换类 public class LongToStringAdapter extends ObjectMapper { private static final long serialVersionUID = 4402127997078513582L; public LongToStringAdapter() { super(); SimpleModule simpleModu

php接口开发时,数据解析失败问题,字符转义,编码问题

php接口开发时,数据解析失败问题,字符转义,编码问题 情景: A平台--->向接口请求数据---->接口向B平台请求数据---->B平台返回数据给接口---->接口返回数据给A平台. 数据经过多遍传递,出现编码.特殊字符转义的的问题. 遇到问题: (1)第一个问题:A发过来的数据,参数值是json字符串,接收到之后无法解析,查看数据后发现json数据中的双引号被转成了" 也就是预定义的字符被转成了HTML实体,需要使用 htmlspecialchars_decode()

jQuery操作列表数据转成Json再输出为html dom树

jQuery 把列表数据转成Json再输出为如下 dom树 <div id="menu" class="lv1"> <ul class="menu"> <li><a href="#" class="parent"><span>aaaaaaaaaaa</span></a> <div class="lv2&quo