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

WebService

首先了解一下WebService,跨语言,跨平台的远程调用技术。一共有三种,一般是采用的http、soap协议 。 我举例的这种就是基于soap协议的,我简单的理解就是XML格式携带参数的一种请求方式。 在PostMan中大概长这样:

使用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 map = new HashMap();

getCode(root, map);

return map;

}

private static void getCode(Element root, Map map) {

if (root.elements() != null) {

List 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

}

}

}

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。