脚本化HTTP
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));
};
- 表单编码(即html中form表单提交中用到的编码,实际上是执行普通的URL编码,使用十六进制转义码替换特殊符号,常用浏览器全局方法encodeURIComponent(text)来编码,格式是:key=val1&key=val2)
- 对响应的处理(onreadystatechange)
- XMLHttpRequest.readyState
- UNSENT 0 初始化阶段,尚未调用open
- OPENED 1 Http已连接,已调用open
- HEADERS_RECEIVED 2 接收到头信息
- LOADING 3 接收到响应主体
- DONE 4 响应完成
- XMLHttpRequest.readyState
- 指定资源解码类型 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的更多相关文章
- 深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法
× 目录 [1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除 前面的话 我们可以通过计算样式来读取伪元素的样式信息 ...
- 深入理解脚本化CSS系列第四篇——脚本化样式表
× 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化 ...
- 深入理解脚本化CSS系列第三篇——脚本化CSS类
前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...
- 深入理解脚本化CSS系列第一篇——脚本化行内样式
× 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样 ...
- (转)mongodb常用命令脚本化-自动化运维
mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护 1 设置副本集 #!/bin/bash#mongodb 进入client ...
- JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)
XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应:但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话. 大多数浏览的客户端JavaScri ...
- JavaScript 客户端JavaScript之 脚本化浏览器窗口
1.计时器 客户端Javascript以全局函数setTimeOut().clearTimeOut().setInterval().clearInterval()提供这一功能. 前者是从运行的那一 ...
- JavaScript 客户端JavaScript之 脚本化文档
客户端JavaScript的存在把静态HTML转变为交互式的Web应用程序,脚本化Web页面的内容正是JavaScript存在的理由. 一个文档对象模型或者说DOM就是一个API,它定义了如何访问 ...
- 权威指南之脚本化jquery
jqury函数 jquery()($())有4种不同的调用方式 第一种是最常用的调用方式是传递css选择器(字符串)给$()方法.当通过这种方式调用时,$()方法会返回当前文档中匹配该选择器的元素集. ...
随机推荐
- DOM4J 解析 XML
1.在项目根目录下新建lib文件夹 2.把dom4j文件拷贝到lib文件夹 3.dom4j,右键Build Path---->Add To Build Path 这样就添加dom4j到项目成功 ...
- POJ2100 Graveyard Design(尺取法)
POJ2100 Graveyard Design 题目大意:给定一个数n,求出一段连续的正整数的平方和等于n的方案数,并输出这些方案,注意输出格式: 循环判断条件可以适当剪支,提高效率,(1^2+2^ ...
- LAMP 搭建wordpress部署教程贴.
LAMP 搭建wordpress部署教程贴.这是一篇主要将LAMP,并且通过wordpress来进行验证,演示.如何去部署PHP CMS很多新手看到LAMP就很很头大,觉得很难搞,编译安装,搞了好几天 ...
- Web项目中JSP页面的一种调试方法与出现的问题 -- SpringMVC架构测试
在前端开发中,尤其是MVC架构多人开发,负责前端的童鞋总是需要做静态页面,再和后台连接前无法使用变量如EL表达式等测试功能,所以本人引入了一个模板jsp数据测试专用文件,专门配置所有的变量,然后在待测 ...
- CSS应用二
样式中的顺序问题. 如:padding,margin,border,等,都是按照顺时针方向赋值的,及上右下左. Padding:1px 2px 3px 4px;(top:1px;right:2px;b ...
- shopnc B2B2C商城 Nginx下开启伪静态
B2B2C商城 Nginx下开启伪静态,伪静态开启后,对系统的SEO极为有利,可以最大限度让商城页面被搜索引擎抓取,但在实际安装中,很多客户在这块都会遇到各种各样的问题. 1. 编辑商城配置文件(da ...
- Robot Framework自动化测试---元素定位
不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了selenium2的 ...
- cf Magic Numbers
http://codeforces.com/contest/320/problem/A #include <cstdio> #include <cstring> using n ...
- QT中窗口刷新事件的学习总结
一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintEvent ( QPaintEvent ...
- MyBatis里json型字段到Java类的映射
一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字符 ...