代码改变世界

javascirpt系列之 - XMLHttpRequest对象(续篇)

2013-05-15 22:42  MoltBoy  阅读(1999)  评论(0编辑  收藏  举报

  —— 生命中最可贵的东西永远是时间,多挤点时间充实自己,别再肆意糟蹋青春。

  接着昨天的内容。前面说的4个重要的步骤,已经都得到实现,在这里XMLHttpRequest还有两个方法,setRequestHeader()方法设置HTTP请求的头信息。abort()方法终止正在进行中的请求。一般极少这样做,并且终止之前,应当先清除onreadystatechange事件处理程序。(指派一个空函数给onreadystatechange,若给它null值,会发生难以预料的错误)

  xhr.setRequestHeader(header, value),调用此方法之前必须进行以下步骤:

  •   确保state是打开的,也就是说已经调用open()方法,否则抛出 "InvalidStateError" 异常;
  •   确保send()没有被调用,否则也会抛出 "InvalidStateError" 异常;
  •   HTTP header字段名和字段值设置正确有效,否则抛出“SyntaxError”异常,值得注意的是,空字符串却是合法有效的,但是一般不这么使用。

  例如:发送表单信息,设置请求头为:

        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

     请求纯文本形式时,设置请求头为:

        xhr.setRequestHeader('Content-Type', 'text/plain');

  向服务端发送了请求,服务端自然会返回响应,而HTTP响应包含3部分:

  •   一个数字和文字组成的状态码,用来显示请求的成功和失败;
  •   一个响应头集合;
  •   响应的主体

  这些都可以通过XMLHttpRequest对象的属性和方法使用。status和statusText属性以数字和文本形式返回HTTP状态码。例如:200和“OK”表示请求成功,404和“Not Found”表示URL不能匹配到服务器上的任何资源。使用getResponseHeader()和getAllResponseHeaders()能获得响应头。

  响应主题可以从responseText属性中得到文本形式的数据,可以从responseXML属性中得到XML Document形式的数据。XMLHttpRequest对象通常使用异步:发送请求后,send()方法立即返回,直到响应返回,前面描述的响应方法和属性才有效,同时监听XMLHttpRequest对象上的readystatechange事件。

  下面定义一个startRequest()函数来演示如何监听readystatechange事件。

function startRequest(url, callback){
    var req = new XMLHttpRequest();    //示例不考虑兼容
    req.open("GET", url, true);
    req.onreadystatechange = function(){
        if(req.readystate == 4){
            if(req.status === 200 || res.status === 304){
                 var type = req.getResponseHeader("Content-Type");
           if(type.indexOf("xml") !== -1 && req.responseXML){
            callback(req.responseXML);
           }else if(type === "application/json"){
            callback(JSON.parse(req.responseText));
          }else{
                   callback(req.responseText);
          }
            }
        }
    }
    req.send(null);      
}

  XMLHttpRequest对象也支持同步调用,当然异步处理HTTP响应是最佳的方式。send()方法之后无需阻塞到请求完成,而是继续下面的代码。如果服务器发送的XML作为响应,可以通过responseXML属性获得一个XML Document对象,可以直接使用DOM方法进行操作。XHR2中应该还能自动解析“text/html”类型的响应。

  在实际应用中,我们主要用到这么几种格式作为响应:XML、JSON、HTML、CSV,当然还可以使用其他纯文本格式。就个人而言,最喜欢用到的是XML和JSON格式。XML格式可以直接使用,JSON就更加融合于Javascript结构,但是它们都有语法严格,内容冗长的缺点。CSV格式是目前存活的比较古龙的数据检索系统,它用逗号来标识数据的开始和结束。格式极为简单,读取相对高效,但是无法包含任何解释性的标识,也就是说只能通过位置来访问它们,不如JSON和XML的(属性名、标签)使用方便。

  总之,要添加大块得数据到前端页面,可选择使用HML格式,只用几行代码就能轻松添加到页面;要是项目比较复杂,需要多人合作,可以选择XML,比较通用;若需要快速检索数据,可以选择JSON和XML。当然选择格式还得同时兼顾客户端和服务端的编码,选择合适的才是最好的。