zoukankan      html  css  js  c++  java
  • javascirpt系列之 XMLHttpRequest对象(续篇)

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

      接着昨天的内容。前面说的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。当然选择格式还得同时兼顾客户端和服务端的编码,选择合适的才是最好的。

  • 相关阅读:
    【USACO】接住苹果
    【题解】任务分配
    【伪·题解】高级打字机
    【noi openjudge题解】最低通行费
    【USACO】草地排水
    【POJ2186】受牛仰慕的牛
    【NOIP2011提高组】选择客栈
    [bzoj1026][SCOI2009]windy数 (数位dp)
    [bzoj1025][SCOI2009]游戏 (分组背包)
    [bzoj1024][SCOI2009]生日快乐 (枚举)
  • 原文地址:https://www.cnblogs.com/moltboy/p/3080879.html
Copyright © 2011-2022 走看看