在js中调用WSS提供的要领是一个会经常运用到的东西,为一个js调用WSS的通用代码,直接拿过来用就可以。
核心部分跟Ajax的核心代码基本相同,都是先构造一个XMLHttpRequest或者ActiveXObject对象,然后就是XML的发送和接收。
SPAPI_Corefunction SPAPI_Core()
{
this.createXMLHttpRequest = function()
{
if (typeof XMLHttpRequest != "undefined")
{
return new XMLHttpRequest()
}
else if (typeof ActiveXObject != "undefined")
{
return new ActiveXObject("Microsoft.XMLHTTP")
}
else
{
throw new Error("XMLHttpRequest not supported")
}
}
this.executeRequest = function(serviceUrl, action, packet, params)
{
var oXMLHttpRequest = this.createXMLHttpRequest()
var result = null
var resultName
oXMLHttpRequest.open("POST", serviceUrl, false)
oXMLHttpRequest.setRequestHeader("Content-Type", "text/xml charset=utf-8")
oXMLHttpRequest.setRequestHeader("SOAPAction", action)
if (params != null)
{
for (var i=0 i < params.length i++)
{
packet = packet.replace('{' + i.toString() + '}', (params[i] == null ? '' : params[i]))
}
}
oXMLHttpRequest.send(packet)
resultName = action.substring(action.lastIndexOf('/') + 1) + 'Result'
'Result'
var resBatch
var status
var statusText
status = oXMLHttpRequest.status
statusText = oXMLHttpRequest.statusText
if (status == 200)
{
// Check for SharePoint error code
resBatch = oXMLHttpRequest.responseXML.getElementsByTagName(resultName)
var codeEl = oXMLHttpRequest.responseXML.getElementsByTagName('ErrorCode')
if (codeEl != null && codeEl.length > 0)
{
var spStatus = parseInt(codeEl[0].childNodes[0].nodeValue)
if (spStatus != 0)
{
status = 0-spStatus // Note we make this -ve to prevent confusion with the HTTP code
var messageEl = oXMLHttpRequest.responseXML.getElementsByTagName('ErrorText')
if (messageEl != null && messageEl.length >= 0)
{
statusText = messageEl[0].childNodes[0].nodeValue
}
}
}
}
result = {
status : status,
statusText : statusText,
responseXML : oXMLHttpRequest.responseXML,
responseText : oXMLHttpRequest.responseText,
resultNode : (resBatch == null resBatch.length == 0 ? null : resBatch[0])
}
return result
}
}
然后就是写WSS中各个要领的调用接口,WSS中提供的要领特别多,这里就不一一列举了,有需要可以追问。
在Web项目中,有时需要通过协议调取来自其他环境的数据。HTTPS是一种应用于安全数据传输的网络协议。我们都知道Ajax可以异步请求数据,但单单通过ajax无法实现跨域。采用一些其他方式需要根据不同的浏览器做相应处理,火狐,谷歌等和IE需要各自做相应判断,所以这种通过浏览器来解析数据虽然省略了数据的解压缩等处理,但是在有安全认证等情况下做跨域处理确比较困难。比如:IE的请求Header无法更改。这时通过Node请求并解析数据就显得比较简单了。如下是nodejs中通过https请求数据的全过程:varhttps=require('https')varzlib=require('zlib')varpost_data="………………"//请求数据varreqdata=JSON.stringify(post_data)varoptions={ hostname:'10.225.***.***', port:'8443', path:'/data/table/list', method:'POST', rejectUnauthorized:false, requestCert:true, auth:'admin:123456************', headers:{'username':'admin','password':'123456************','Cookie':'locale=zh_CN','X-BuildTime':'2015-01-0120:04:11','Autologin':'4','Accept-Encoding':'gzip,deflate','X-Timeout':'3600000','Content-Type':'Application/json',"Content-Length":reqdata.length }}varreq=https.request(options,function(res){})req.write(reqdata)req.on('response',function(response){ switch(response.headers['content-encoding']){case'gzip': varbody='' vargunzip=zlib.createGunzip() response.pipe(gunzip) gunzip.on('data',function(data){body+=data }) gunzip.on('end',function(){varreturndatatojson=JSON.parse(body) req.end() }) gunzip.on('error',function(e){console.log('error'+e.toString()) req.end() }) break case'deflate': varoutput=fs.createWriteStream("d:temp.txt") response.pipe(zlib.createInflate()).pipe(output) req.end() break default:req.end() break }})req.on('error',function(e){ console.log(newError('problemwithrequest:'+e.message)) req.end() setTimeout(cb,10)})注:options,需要有请求数据的长度,options需要加上'Accept-Encoding':'gzip,deflate',返回的数据需要判断是哪种压缩方式,然后解压缩获取到数据。gunzip的end事件里的returndatatojson即是获取的数据。要用websocket来搞定。不用websocket就要用ajax轮询来实现,比较耗资源。
nodejs简单的websocket 服务端实现
// 在安装了nodejs的情况,用npm install wsconst ws = require('ws')
const wss = new ws.Server({port: 8080})
let users = 0
wss.on('connection', function(ws) {
ws.on('message', function(message) {
// message的内容客户端发送过来
if (message === '进入') {
// 进入成功的时候,操作代码
users = ++users
console.log('正在浏览....', '在线用户数量:', users)
}
})
ws.on('close', function(close) {
try{
// 退出的时候,操作代码
users = --users
console.log('已经离开')
}catch(e){
}
})
ws.on('error', function() {})
})
客户端(浏览器):
<!DOCTYPE html><html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
var ws = new WebSocket("ws://localhost:8080")
ws.onopen = function(e) {
console.log(e)
ws.send('进入')
}
ws.onclose = function(e) {
ws.send('离开了!!!!')
}
</script>
</head>
<body>
</body>
</html>