使用XMLHTTP Request Object获取服务器数据

 

使用XMLHTTP Request Object获取服务器数据

    在Web客户端使用xmlhttp对象,可以十分方便的和服务器交换数据,我们可以获取和发送任何类型的数据,甚至二进制数据到服务器上。xmlhttp技术同时也是目前大多数无刷新页面使用的和服务器交换数据的方式,这种方式比以往的隐藏iframe的方法要方便和经济的多。 

    同时让我们高兴得是xmlhttp并不是IE特有的东西,虽然目前还不是W3C的标准,不过IE, Netscape/Mozilla, 和Safari都支持。在IE中我们使用new ActiveXObject('MSXML2.XMLHTTP')或者new ActiveXObject("Microsoft.XMLHTTP")来获得的xmlhttp对象实例,使用前者还是后者和客户端机器安装的MSXML版本有关。在Netscape/Mozilla和Safari中,使用new XMLHttpRequest()来获得xmlhttp对象实例。比如在IE中,我们通常这样使用:

var  xmlhttp  =   null ;  
try   
{  
    xmlhttp  =   new  ActiveXObject( " MSXML2.XMLHTTP " );  
}  
catch (e)  
{  
     try   
    {  
        xmlhttp  =   new  ActiveXObject( " Microsoft.XMLHTTP " );  
    }  
     catch (e2){}  

 


    使用xmlhttp对象其实是并不是什么困难的事,它一共就6个方法8个属性。不过它最主要的是提供了两种执行模式:同步模式和异步模式。同步模式可以比较精确的控制程序流程,可是如果服务器的Response太慢,browser会有死掉失去相应的问题;而使用异步模式由于是事件触发方式控制流程,会给程序运行带来一些不可与预计的问题,因为你不知道客户端等待服务器Response的过程中,用户会在browser里做什么操作。  

    下面是一个同步方式获取服务器数据的简单示例:

function  GetRemoteData(url) 

     var  xmlhttp  =   new  ActiveXObject( " Microsoft.XMLHTTP " ); 
     try  
    {   
         xmlhttp.open('GET', url,  false ); 
          if  ( xmlhttp.status  ==   200  ) 
         { 
              return  xmlhttp.responseText; 
         } 
          throw  '';  
    } 
     catch (e) 
    { 
          return  ''; 
    } 
}


    XMLHTTP对象的属性和方法列表(来自IXMLHTTPRequest接口):

   
NameTypeDescription
onreadystatechangeN/A指定当就绪状态发生改变时调用的事件处理函数,仅用于异步操作 
readyStateLong异步操作的状态:未初始化(0),正在加载(1),已加载(2),交互(3),已完成(4)
responseBodyVariant将响应信息正文作为unsigned byte数组返回
responseStreamVariant将响应信息正文作为一个ADO Stream对象返回
responseTextString将响应信息正文作为一个文本字符串返回
responseXMLObject通过XMLDom将响应信息正文解析为XMLDocument对象
statusLong服务器返回的HTTP状态码
statusTextString服务器HTTP响应行状态
   
NameDesciption
abort取消当前 HTTP 请求
getAllResponseHeaders从响应信息中检索所有的标头字段
getResponseHeader从响应信息正文中获得一个 HTTP 标头值
open(method, url, boolAsync, bstrUser, bstrPassword)打开一个与 HTTP 服务器的连接
send(varBody)设定一个请求的标头字段
setRequestHeader(bstrHeader, bstrValue)向 HTTP 服务器发送请求。可包含正文。

    这里面显然就open方法比较麻烦,带了一大堆参数,它们的含义分别是:
   
ParameterDescription
methodHTTP的通信方式,比如GET, HEAD, POST, PUT, DELETE, CONNECT等
url接收数据的服务器的URL地址,URL可带QueryString
boolAsync一个布尔标识,说明请求是否为异步的。如果是异步通信方式,客户端就不等待服务器的响应;如果是同步方式,客户机会等到服务器返回消息后才去执行其它操作
bstrUser用户ID,用于服务器身份验证
bstrPassword用户密码,用于服务器身份验证

    异步通讯的示例:

xmlhttp.open( " GET " ,  " default.aspx " ,  true ); 
xmlhttp.onreadystatechange  =   function () 

     if  ( xmlhttp.readyState == 4  ) 
    { 
        alert(xmlhttp.responseText); 
    } 

xmlhttp.send( null );


    其实使用xmlhttp就这么简单,复杂的是服务器端数据的组织方式,而且需要开发人员同时熟悉Client和Server端的开发,才能事半功倍。可是好像说了半天这个玩意儿和xml没有什么关系啊,怎么叫xmlhttp呢?我们注意到response的数据类型中有一个responseXML,不过它解析返回的XMLDocument属于XMLDOM的内容了,和使用xmlhttp来和服务器通讯的关系并不大,以后再来细说。

 

 

AJAX中XMLHttpRequest同步异步的疑惑
2008-09-06 12:00

如果是同步(false),返回值是true或false,因为执行完send后,开始执行onreadystatechange,程序会等到 onreadystatechange都执行完,取得responseText后才会继续执行下一条语句,所以returnValue一定有值。 
如果是异步(true),返回值一定是null,因为程序执行完send后不等xmlhttp的响应,而继续执行下一条语句,所以returnValue还没有来的及变化就已经返回null了。


所有如果想获得xmlhttp返回值必须用同步,异步无法得到返回值。

同步异步使用xmlhttp池时都要注意:取得xmlhttp时只能新建xmlhttp,不能从池中取出已用过的xmlhttp,因为被使用过的xmlhttp的readyState为4,所以同步异步都会send但不执行onreadystatechange。

同步就是发送和接受数据的双方保持步调一致,发送数据方发送数据后,必须等到接受数据方发回了接受到了数据的信息后,才能做下面的事情;而作为接收数据方,在决定接收后,必须接收到数据后才能做下面的事情,它需要不断地轮询接收缓冲区有没有数据,又称为阻塞方式。   
异步则是在发送和接收数据时还可以做其它的事情,又称为非阻塞方式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值