业务场景:海康视频平台为第三方接口,工作系统开发需要接入海康的视频接口,在自己的业务平台中播放海康接到的视频。
业务基础:海康的平台接口为web serveice接口。
技术准备:
1.什么是web service?
soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为:text/xml任何数据都可以xml化。
2.相对http(post/get)有好处吗?
a.接口中实现方法和要求参数一目了然
b.不用担心大小写问题
c.不用担心中文urlencode
d.代码中不用多次声明认证(账号,密码)参数
e.传递参数可以为数组,对象等。。。
3.速度如何?是否可被http(post/get)替代
由于需要进行xml解析,速度会有所降低。
完全可以被替代。
参考文章:https://www.cnblogs.com/leeego-123/p/10404631.html
代码示例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>海康视频测试</title>
<meta charset="UTF-8">
</head>
<body onload="init();">
<!-- web端初始化视频窗口 -->
<object classid="clsid:6DABF69C-7610-4D25-BC4F-664003130B94"
id="RealTimePlayOcx" width="100%" height="100%"
name="RealTimePlayOcx">
<param name="theme" value="blue">
<param name="showType" value="5">
</object>
<div class="selWinNum">
<select id="selsplit" onchange="setWindowsLayout()">
<option value="1">请选择窗口布局</option>
<option value="1">1*1</option>
<option value="2">2*2</option>
<option value="3">3*3</option>
<option value="5">4*4</option>
</select>
<button onclick="login()">登录</button>
<input type="text" id="inputVal"/>
<button onclick="getVideoInFo()">播放视频</button>
<button onclick="stopPreview()">停止播放</button>
</div>
<div class="selWinNum">
</div>
<script>
/* 初始化页面 */
function init() {
var loginData = 1;
var RealTimePlayOcx = document.getElementById("RealTimePlayOcx");
console.log("页面初始化。。。")
}
function applyXML(a) {
var RealTimePlayOcx = document.getElementById("RealTimePlayOcx");
var xml = a;
var wnd = RealTimePlayOcx.GetCurrentSelectWindow();
RealTimePlayOcx.StartPreview(xml.replace(/</g, "<"), wnd);
}
// 停止预览
function stopPreview(){
var RealTimePlayOcx = document.getElementById("RealTimePlayOcx");
var wnd = RealTimePlayOcx.GetCurrentSelectWindow();
RealTimePlayOcx.StopPreview(wnd);
}
// 切换分屏
function setWindowsLayout() {
var selectDom = document.getElementById('selsplit')
, index = selectDom.selectedIndex
, value = selectDom[index].value;
var RealTimePlayOcx = document.getElementById("RealTimePlayOcx");
RealTimePlayOcx.SetLayoutType(Number(value));
}
</script>
<script>
var videoToken = "";
var cameraIndexCode = "13010402001310001221";
var xmlhttp = new XMLHttpRequest();
function login() {
var URL="http://10.122.2.211:80/vms/services/VmsSdkWebService/sdkLogin?wsdl=";
var data = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.vms.ivms6.hikvision.com\">\n" +
" <soapenv:Header/>\n" +
" <soapenv:Body>\n" +
" <ws:sdkLogin>\n" +
" <ws:loginAccount>admin</ws:loginAccount>\n" +
" <ws:password>8122cba12b897aa5546baf90b6c82c9f646f976b3555033cbc5e0b72d4f7a5bc</ws:password>\n" +
" <ws:serviceIp>10.122.2.211</ws:serviceIp>\n" +
" <ws:clientIp></ws:clientIp>\n" +
" <ws:clientMac></ws:clientMac>\n" +
" </ws:sdkLogin>\n" +
" </soapenv:Body>\n" +
"</soapenv:Envelope>";
xmlhttp.onreadystatechange = callback1;
xmlhttp.open('post',URL, true);
xmlhttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
xmlhttp.send(data);
}
function callback1() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
console.log(xmlhttp.responseText);
xmlNode(xmlhttp.responseText);
} else {
console.log('ready');
}
} else if(xmlhttp.readyState == 0){
console.log('登录请求未初始化');
} else if(xmlhttp.readyState == 1){
console.log('登录服务器连接已建立');
} else if(xmlhttp.readyState == 2){
console.log('登录请求已接收');
} else if(xmlhttp.readyState == 3){
console.log('登录请求处理中');
}
}
// 解析登录返回xml
function xmlNode(node) {
var str = node;
var aPos = str.indexOf('tgt="');
var bPos = str.indexOf('netzoneid');
videoToken = str.substr(aPos + 5, bPos - aPos -7);
console.log("videoToken:------------- "+videoToken);
var t2 = window.setInterval(function() {
apllyToken(videoToken);
},30000)
// window.clearInterval(t2) // 去除定时器
}
function apllyToken(tokenCode) {
var URL="http://10.122.2.211:80/vms/services/VmsSdkWebService/applyToken?wsdl";
var data = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.vms.ivms6.hikvision.com\">\n" +
" <soapenv:Header/>\n" +
" <soapenv:Body>\n" +
" <ws:applyToken>\n" +
" <ws:token>" + tokenCode + "</ws:token>\n" +
" </ws:applyToken>\n" +
" </soapenv:Body>\n" +
"</soapenv:Envelope>";
xmlhttp.onreadystatechange = callback2;
xmlhttp.open('post',URL, true);
xmlhttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
xmlhttp.send(data);
}
function callback2() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
var data = xmlhttp.responseText;
}
}
}
function getVideoInFo() {
var cameraCode = document.getElementById('inputVal').value;
console.log(cameraCode);
if (!cameraCode) {
alert('请输入视频编号');
return;
}
var URL="http://10.122.2.211:80/vms/services/VmsSdkWebService/getPreviewOcxOptions?wsdl";
var data = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.vms.ivms6.hikvision.com\">\n" +
" <soapenv:Header/>\n" +
" <soapenv:Body>\n" +
" <ws:getPreviewOcxOptions>\n" +
" <ws:token>" + videoToken + "</ws:token>\n" +
" <ws:cameraIndexCode>"+ cameraCode +"</ws:cameraIndexCode>\n" +
" <ws:clientIp>10.122.2.211</ws:clientIp>\n" +
" </ws:getPreviewOcxOptions>\n" +
" </soapenv:Body>\n" +
"</soapenv:Envelope>";
xmlhttp.onreadystatechange = callback3;
xmlhttp.open('post',URL, true);
xmlhttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
xmlhttp.send(data);
}
function callback3() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
subVideoInfo(xmlhttp.responseText)
} else {
console.log('ready');
}
} else if(xmlhttp.readyState == 0){
console.log('监测点信息请求未初始化');
} else if(xmlhttp.readyState == 1){
console.log('监测点信息服务器连接已建立');
} else if(xmlhttp.readyState == 2){
console.log('监测点信息请求已接收');
} else if(xmlhttp.readyState == 3){
console.log('监测点信息请求处理中');
}
}
function subVideoInfo(videoInfo) {
var str = videoInfo;
var aPos = str.indexOf('return>');
var bPos = str.indexOf('</ns:return>');
var a = str.substr(aPos + 7, bPos - aPos);
applyXML(a);
console.log("检测点信息xml:"+a)
}
</script>
</body>
</html>
写在后面:接口可以使用soapUI进行调试,调通接口之后,将web service需要的传值的整个xml格式复制,放在http的data传值中。
webservice接口简单来看就是把原来传的json变成xml格式字符串,接收到的result也是xml格式的字符串,需要解析xml格式的字符串,拿到需要的值。