Java发送WebService请求并解析数据(与大华DSS 7016s2设备对接为例)

最近项目需要与大华的监控设备做对接,需要使用WebService发送请求,并解析数据刷入数据库,总结了一套我认为好理解的方案:

WebService

首先了解一下WebService,跨语言,跨平台的远程调用技术。一共有三种,一般是采用的http、soap协议 。
我举例的这种就是基于soap协议的,我简单的理解就是XML格式携带参数的一种请求方式。
在PostMan中大概长这样:
Java发送WebService请求并解析数据(与大华DSS 7016s2设备对接为例)_第1张图片

使用Java发送并解析WebService请求:

参考了一些方案我采用的是httpClient这种方式,以下代码是我封装的一个给大华dss监控设备发送请求的方法,使用这种方式的好处是,无需在java代码和xml中来回穿插。xml中内容清晰,可以参考:

     * @param ip
     * @param port
     * @param identification 接口标识
     * @param jsonParameter 接口需要传入的json参数
     * @return 返回一个Map, 具体需要拿到解析
     */
    private static JSONObject pullDaHuaData(String ip, String port, String identification, String jsonParameter) throws IOException, DocumentException {
        String xml = "\n" +
                " +
                "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" +
                "  \n" +
                "    \n" +
                "      " + identification + "\n" +
                "      {param:" + jsonParameter + "}\n" +
                "    \n" +
                "  \n" +
                "";
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        HttpPost httpPost = new HttpPost("http://" + ip + ":" + port + "/admin/services/AdminWebService?wsdl");
        httpPost.setHeader("Context-Type", "text/xml;charset=UTF-8");
        CloseableHttpResponse response = null;

        StringEntity entity = new StringEntity(xml, "UTF-8");
        httpPost.setEntity(entity);
        response = httpClient.execute(httpPost);
        HttpEntity responseEntity = response.getEntity();
        Map map = parseSoap(EntityUtils.toString(responseEntity));
        return (JSONObject) JSONObject.parse(String.valueOf(map.get("execute")));
    }

    /**
     * 解析WebService响应回的soap
     *
     * @param soap
     * @return
     * @throws DocumentException
     * @throws DocumentException
     */
    private static Map parseSoap(String soap) throws DocumentException, DocumentException {
        org.dom4j.Document doc = DocumentHelper.parseText(soap);//报文转成doc对象
        Element root = doc.getRootElement();//获取根元素,准备递归解析这个XML树
        Map<String, Object> map = new HashMap<String, Object>();
        getCode(root, map);
        return map;
    }

    private static void getCode(Element root, Map<String, Object> map) {
        if (root.elements() != null) {
            List<Element> list = root.elements();//如果当前跟节点有子节点,找到子节点
            for (Element e : list) {//遍历每个节点
                if (e.elements().size() > 0) {
                    getCode(e, map);//当前节点不为空的话,递归遍历子节点;
                }
                if (e.elements().size() == 0) {
                    map.put(e.getName(), e.getTextTrim());
                }//如果为叶子节点,那么直接把名字和值放入map
            }
        }

    }

你可能感兴趣的:(java菜鸟笔记,java,postman,开发语言)