最近项目需要与大华的监控设备做对接,需要使用WebService发送请求,并解析数据刷入数据库,总结了一套我认为好理解的方案:
WebService
首先了解一下WebService,跨语言,跨平台的远程调用技术。一共有三种,一般是采用的http、soap协议 。
我举例的这种就是基于soap协议的,我简单的理解就是XML格式携带参数的一种请求方式。
在PostMan中大概长这样:
文章来源:https://www.toymoban.com/news/detail-548817.html
使用Java发送并解析WebService请求:
参考了一些方案我采用的是httpClient这种方式,以下代码是我封装的一个给大华dss监控设备发送请求的方法,使用这种方式的好处是,无需在java代码和xml中来回穿插。xml中内容清晰,可以参考:文章来源地址https://www.toymoban.com/news/detail-548817.html
* @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 = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" +
" <soap:Body>\n" +
" <executeInterface xmlns=\"http://webservice.dhsoft.com\">\n" +
" <arg0 xmlns=\"\">" + identification + "</arg0>\n" +
" <arg1 xmlns=\"\">{param:" + jsonParameter + "}</arg1>\n" +
" </executeInterface>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
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发送WebService请求并解析数据(与大华DSS 7016s2设备对接为例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!