1、HTTP:

  • 定义:超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
  • 通信要求:在一台计算机上获取并显示存放在多台计算机里的文本、数据、图片和其他类型的文件。

2、原始的Web客户端与Ajax架构的脚本化HTTP

  • 原始:通过链接、提交表单、和输入url、window.location.href、formObj.submit()
  • 异步、局部刷新体验:Ajax(用脚本操纵HTTP请求的Web应用架构)

3、Ajax与Comet,前者主动从服务器拉数据,后者从服务器向客户端推送数据

4、XMLHttpRequest

  • 兼容Web,对各种文本文件即可操作,并非只有XML
  • 标准支持HTTP和HTTPS(存在一些实现了其他传输协议的非标准版本)
  • IE7+与其他主流浏览器被支持 (IE5、6如下添加支持,IE5、6下XMLHttpRequest是ActiveX对象)
(function initXHR() {
if (w.XMLHttpRequest === undefined) {
w.XMLHttpRequest = function () {
try {
// 如果可用,则使用ActiveX对象的最新版本
return new ActiveXObject('Msxml2.XMLHTTP.6.0');
// JavaScript权威指南
// return new ActiveXObject('Msxml2.XMLHTTP'); // 百度名片
} catch (e) {
try {
// 否则回退到较老版本
return new ActiveXObject('Msxml2.XMLHTTP.3.0');
// JavaScript权威指南
// return new ActiveXObject('Microsoft.XMLHTTP'); // 百度名片
} catch (e) {
// 否则抛错
throw new Error('XMLHttpRequest is not supported');
}
}
};
}
}());

5、Http请求和响应分解

  • 请求

    • type     请求的方式(get、post、put)
    • url      请求的url地址
    • header  请求头
    • body     请求主体
  • 响应
    • status   响应状态,由数字或字符串(404:'Not Found',200:'OK')
    • header  响应头
    • body     响应主体

* IE下可以用本地文件进行Http请求,同源策略下其他主流浏览器做了交叉访问限制

  • 方法调用的顺序

    • var request = new XMLHttpRequest();
    • request.open('GET', 'url', async, user, pwd);
    • request.setRequestHeader('Content-type', 'text/plain; charset=UTF-8');  // request.getRequestHeader('Content-Type');
    • request.send(null);
      // get
      // init
      var request = new XMLHttpRequest();
      // connect
      request.open('GET', url, async, user, pwd);
      // setHeader
      request.setHeader(key, value);
      // send
      request.send(null); // post
      var request = new XMLHttpRequest();
      // connect
      request.open('POST', url, async, user, pwd);
      // setHeader
      request.setHeader(key, value);
      // send
      request.send(JSON.stringify({data:'test'}));
  • 对请求主体的编码
    • 表单编码(即html中form表单提交中用到的编码,实际上是执行普通的URL编码,使用十六进制转义码替换特殊符号,常用浏览器全局方法encodeURIComponent(text)来编码,格式是:key=val1&key=val2)

      // 把JSON类型的对象解析成表单编码的字符串
      var encodeFormData = function (data) {
      if (!data) return '';
      var pairs = [
      ];
      for (var key in data) {
      // 跳过继承属性和方法
      if (!data.hasOwnProperty(key) || typeof data[key] === 'function') continue;
      var value = data[key].toString();
      // %20是' '(长度为1)的16进制转义符号,在某些(作者也不知道是哪些,有兴趣的自己去了解一下)服务器处理中会将'+'号和空格互换
      // 即decoding的时候把'+'号解析成空格,encoding的时候把空格转成'+'
      key = encodeURIComponent(key.replace(/%20/g, '+'));
      value = encodeURIComponent(value.replace(/%20/g, '+'));
      pairs.push(key + '=' + value);
      }
      return pairs.join('&');
      };
      var postData = function (url, data, callback) {
      var request = XMLHttpRequest();
      request.open('POST', url);
      request.onreadystatechange = function () {
      if (this.readyState === 4 && typeof callback === 'function') callback(this);
      };
      request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      request.send(encodeFormData(data));
      };
  • 对响应的处理(onreadystatechange)
    • XMLHttpRequest.readyState

      • UNSENT                     0   初始化阶段,尚未调用open
      • OPENED                        1   Http已连接,已调用open
      • HEADERS_RECEIVED      2   接收到头信息
      • LOADING                   3   接收到响应主体
      • DONE                            4  响应完成
  • 指定资源解码类型 request.overrideMimeType('text/plain; charset=utf-8'); // 需要在send方法触发前指定,使用场景,当你比服务器更清楚返回值的类型的时候
  • 当响应返回的xhr.getResponseHeader('Content-Type')是xml或html类型的时候,可以通过下面的方法解析(目前只支持主流浏览器和IE10+的html解析),当前浏览器支持xmlHttpRequest.responseXML属性(即会自动把响应类型为xml的文档解析成dom),相信后续版本会实现html的解析(HTMLDocument对象与XML的DOM对象API不同)
    var parser = (function () {
    try {
    //Firefox, Mozilla, Opera, etc, IE9+(IE10+才支持html解析)
    parser = new DOMParser();
    return parser;
    } catch (e) {
    return null;
    }
    }());
    var xmlParse = function (text, type) {
    var xmlDoc = null;
    if (parser) {
    try {
    // 默认xml解析,当前主流浏览器和IE10+(包含)支持type为html的解析,解析成HTMLDocument对象
    xmlDoc = parser.parseFromString(text, 'text/' + (type || 'xml'));
    return xmlDoc;
    } catch (e) { }
    }
    try {
    //Internet Explorer(可能作者水平不够,用这个插件解析,只能解析XML,而且对象屏蔽属性,超难调试)
    xmlDoc = new ActiveXObject ("MSXML2.DOMDocument");
    var flag = xmlDoc.loadXML(text);
    // 解析成功 返回,否则返回未解析的文本
    if (flag) return xmlDoc;
    return text;
    } catch (e1) {
    alert(e1.message);
    }
    };

脚本化HTTP的更多相关文章

  1. 深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法

    × 目录 [1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除 前面的话 我们可以通过计算样式来读取伪元素的样式信息 ...

  2. 深入理解脚本化CSS系列第四篇——脚本化样式表

    × 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化 ...

  3. 深入理解脚本化CSS系列第三篇——脚本化CSS类

    前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...

  4. 深入理解脚本化CSS系列第一篇——脚本化行内样式

    × 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样 ...

  5. (转)mongodb常用命令脚本化-自动化运维

    mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护   1 设置副本集   #!/bin/bash#mongodb 进入client ...

  6. JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)

    XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应:但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话.   大多数浏览的客户端JavaScri ...

  7. JavaScript 客户端JavaScript之 脚本化浏览器窗口

    1.计时器 客户端Javascript以全局函数setTimeOut().clearTimeOut().setInterval().clearInterval()提供这一功能.   前者是从运行的那一 ...

  8. JavaScript 客户端JavaScript之 脚本化文档

    客户端JavaScript的存在把静态HTML转变为交互式的Web应用程序,脚本化Web页面的内容正是JavaScript存在的理由.   一个文档对象模型或者说DOM就是一个API,它定义了如何访问 ...

  9. 权威指南之脚本化jquery

    jqury函数 jquery()($())有4种不同的调用方式 第一种是最常用的调用方式是传递css选择器(字符串)给$()方法.当通过这种方式调用时,$()方法会返回当前文档中匹配该选择器的元素集. ...

随机推荐

  1. 第1章 网络编程基础(2)——Socket编程原理

    Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...

  2. (原)anaconda 的安装与在pycharm中的版本切换

    参考网页: http://continuum.io/blog/anaconda-python-3 http://conda.pydata.org/docs/intro.html#creating-py ...

  3. SQL server 2008无法修改表

    长久未使用SQL server,一直都是使用Navicat来处理各种数据库,感觉使用很方便,但由于实际需要,必须要用SQL server创建新的数据库,却意外的遇到了以前从未遇到过的问题. 在建好表以 ...

  4. 01.Editplus+Lua配置

    学习一门语言有一款简单顺手的编辑工具很重要,我使用Editplus要多一点:就想能不能加上Lua支持,网上一搜还还不少.现把配置记录下来,也算做个笔记吧! Editplus版本是中文3.41(网上下吧 ...

  5. [Mugeda HTML5技术教程之9]使用元件

    元件是一个可以在舞台上实例化和再利用的预先生成的独立动画.一个元件有它自己的时间轴(层,单位等),可以独立显示的动画.元件提高了动画的重用性和灵活性,是个强大的存在.元件可用于创建复杂的动画效果. 所 ...

  6. FileZilla Server下载以及安装使用

    新版本filezilla server已经不能在windows xp和windows20003下使用了 下面是可以在xp和2003下使用的最后版本下载地址 http://pan.baidu.com/s ...

  7. Android高清巨图加载方案

    1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...

  8. write a macro to judge big endian or little endian

    Big endian means the most significant byte stores first in memory. int a=0x01020304, if the cpu is b ...

  9. 桌面上嵌入窗口(桌面日历)原理探索(将该窗口的Owner设置成桌面的Shell 窗口,可使用SetWindowLong更改窗口的GWL_HWNDPARENT,还要使用SetWindowPos设置Z-Order)

    今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面,让它和桌面融为一体,就像很多桌面日历软件那样. 我当时想到的就是建立一个Child  Window,将他的父窗口设置成桌面Shell窗口就可以了.但是 ...

  10. EE就业最好的方向是转CS,其次是VLSI/ASIC DESIGN & VERIFICATION

    Warald在2012年写过一篇文章<EE现在最好就业的方向是VLSI/ASIC DESIGN VERIFICATION>,三年过去了,很多学电子工程的同学想知道现在形势如何. 首先,按照 ...