由于XMLHTTP的渐渐流行,现在不少系统之间的数据交换开始流行用XML作为数据载体以HTTP方式进行传输,不知道这是不是WEBSERVERS的一种不标准的实现方式。通常 ,我们知道WEBSERVERS也是建立在XML之上的,但是它使用起来确实非常方便,因为我们可以获得一个服务的实例可以方便的调用它有的方法。但是XMLHTTP这个随着AJAX火起来的东东,我想可能就不是那么简单好用了,因为我确实没有用他来作个和其他系统的接口。
而这种事情就让我遇上了,因为项目需要,我们要从其它系统获取数据,对方本来说提供WEBSERVERS给我们,但是后来却告述我们这样一个接口方案:双方以协定的xml文档,系统以xmlhttp方式进行消息传递。在AJAX中也知道XMLHTTP这种方式,那就弄吧。
先创建一个XMLHTTP对象:
function CreateActiveObject()
{//初始化 var http_request = false; //开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest)
{ //Mozilla 浏览器 http_request = new XMLHttpRequest();
if (http_request.overrideMimeType)
{//设置MiME类别 http_request.overrideMimeType("text/xml"); } }
else if (window.ActiveXObject)
{ // IE浏览器
try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e)
{ try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) {} } }
return http_request;
}
接下来就准备XML数据给他POST过去吧
function GetXml(phone,startTime,endTime)
{ var head=" ";
var body=" ";
var foot = "";
return head+body+foot; }
function clickServer(phone,startTime,endTime)
{ xmlHttp = CreateActiveObject();
if(!xmlHttp) { window.alert("不能创建XMLHttpRequest对象实例.");
return false; }
else
{ xmlHttp.onreadystatechange = processRequest; // 确定发送请求的方式和URL以及是否同步执行下段代码
var xmlMsg = GetXml(phone,startTime,endTime) ;
xmlHttp.open("post", http://111.111.111/aaa, false);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttp.send(xmlMsg); }
}
// 处理返回信息的函数
function processRequest()
{ if (xmlHttp.readyState == 4) { // 判断对象状态
if (xmlHttp.status == 200) { // 信息已经成功返回,开始处理信息
processXml(xmlHttp.responseXml); }
else { //页面不正常 alert(xmlHttp.status+'数据查询失败!'); }
} }
把返回的XML解析成一个TABLE放到页面去
前提是页面要有一个TABLE的定义:
<tbody id="xmlBody"></tbody>
</table>*/
function processXml(xmlText)
{ var xmlDom =createXmlDom();
if(xmlDom != null)
{ xmlDom.loadXML(xmlText.xml);
var result = xmlDom.getElementsByTagName("Result");
for(var i=0;i<resul.length;++i)
{
var column1 = document.createElement('td');
var colValue1 = document.createTextNode(result[i].getAttribute('aaa'));
column1.appendChild(colValue1);
var column2 = document.createElement('td');
var colValue2 = document.createTextNode(result[i].getAttribute('bbb'));
column2.appendChild(colValue2);
var column3 = document.createElement('td');
var colValue3 = document.createTextNode(result[i].getAttribute('ccc'));
column3.appendChild(colValue3);
var column4 = document.createElement('td');
var colValue4 = document.createTextNode(result[i].getAttribute('ddd'));
column4.appendChild(colValue4);
var column5 = document.createElement('td');
var colValue5 = document.createTextNode(result[i].getAttribute('eee'));
column5.appendChild(colValue5);
var column6 = document.createElement('td');
var colValue6 = document.createTextNode(result[i].getAttribute('fff'));
column6.appendChild(colValue6);
var row = document.createElement('tr');
row.appendChild(column1);
row.appendChild(column2);
row.appendChild(column3);
row.appendChild(column4);
row.appendChild(column5);
row.appendChild(column6);
document.getElementById('xmlBody').appendChild(row);
}
}
}
function createXmlDom()
{
var signatures =["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];
for(var i=0;i<signatures.length;++i)
{
try
{
var domDoc=new ActiveXObject(signatures[i]);
return domDoc;
}
catch(e){}
}
return null;
}
上面做了以后,已经达到了交换数据的效果,但是却由此产生了两个问题,一个是XMLHTTP中JAVASCRIPT的跨域访问的问题,虽然IE只是给出一个警告,但是客户不知道还以为系统有问题呢,二是用了ACTIVEX,而现在很多浏览器都是关闭了ACTIVEX的,这两个虽然都不是大问题,但总是不好,因为没有对客户屏蔽掉。
于是又在想有没有其他的方式呢,最后明白服务器后台也可以实现XMLHTTP,但是有了和服务器的交互,效率可能会下降,但是没有了警告提示,没有了ACTIVEX,客户没有意见了,哎,那就重新又弄过吧。