使用javascript代码操作http是可行的。当用脚本设置window对象的location属性或调用表单对象的submit方法时,都会初始化http请求。这两种情况下,浏览器会加载新页面。

ajax描述了一种使用脚本操纵http的web应用框架。ajax应用的主要特点是使用脚本操纵http和web服务器进行数据交换,不会导致页面重载。在某种意义上,comet与ajax相反。在comet中,web服务器发起通信并异步发送消息到客户端。如果web应用要相应服务器发送的消息,则它会使用ajax技术发送或请求数据。

实现ajax和comet的方式有很多种,而这些底层的实现有时称为传输协议。例如 img元素有一个src属性。当脚本设置这个属为url时,浏览器发起的httpget请求会从这个url下载图片。因此,脚本通过设置img元素的src属性,且把信息作为图片url的查询字符串部分,就把能经过编码信息传递给web服务器。img元素无法实现完整的ajax传输协议。因为数据交换生单向的

为了把iframe作为ajax传输协议使用,脚本首先要把发送给web服务器的信息编码到url中,然后设置iframe的src属性为该url。服务器能创建一个包含响应内容的html文档,并把它返回给web浏览器,并且在iframe中显示它。iframe需要对用户不可见,例如可以使用css隐藏它,脚本能通过遍历ifame的文档对象来读取服务器的响应。这种房屋受限于同源策略

实际上 script元素的src属性能设置url并发起htttpget请求,使用script元素实现脚本操作http是非常吸引人的。因为他们可以跨域通信而不受限于同源策略。使用基于script的ajax传输协议时,服务器的响应采用json编码的数据格式,当执行脚本时,javascript解析器能自动将其解码。由于他使用json数据格式,因此这种ajax传输协议也叫做jsonp

所有浏览器都支持XMLHttpRequest对象,它定义了API,除了常用的GET请求,这个API还包括实现POST请求的能力,同时它能用文本或Document对象的形式返回服务器的响应。

浏览器在XMLHttpRequest类上定义了它们的http API.这个类的每个实例都表示一个独立的请求/响应对,并且这个对象的属性和方法允许指定请求细节和提取相应数据

使用这个HTTP API必须做的第一件事就是实例化XMLHttpRequest对象

var request=new XMLHttpRequest();

也能重用已存在的XMLHttpRequest,但注意这将终止之前通过该对象挂起的任何请求。ie7之前的版本不支持非标准的XMLHttpRequest()构造函数,但能模拟

if(window.XMLHttpRequest===undefined){
window.XMLHttpRequest=function(){
try{
return new ActiveXOject("Msxml2.XMLHTTP.6.0");
}
catch(e1){ try{
return new ActiveXObject("Msxml2.XMLHTTP.3.0");
}
catch(e2)
{
throw new Error("XMLHttpRequest is not supported"); } } }; }

一个http请求有4部分组成

1、http请求方法或动作

2、正在请求的URL

3、一个可选的请求头集合,可能包含身份验证信息

4一个可选的请求主体

服务器返回的http响应包含3部分

1、一个数字和文字组成的状态码,用来显示请求的成功和失败

2、一个响应头集合

3、响应主体

创建XMLHttpRequest对象之后,发起HTTP请求的下一步是调用XMLHttpRequest对象的open方法去指定这个请求的两个必需部分:方法和URL

request.open("GET","data.csv");

如果有请求头的话,请求进程的下个步骤是设置它,例如,post请求需要“Content-Type”头指定请求主体的MIME类型:

request.setRequestHeader("Content-Type","text/plain");

使用XMLHttpRequest发起HTTP请求的最后一步是指定可选的请求主体并向服务器发送它。使用send方法像如下这样做

request.send(null);

get请求绝对没有主体,所以应该传递null或省略这个参数。post请求通常拥有主体,同时它应该匹配使用setRequestHeader指定的“Content-Type”头;

http请求的各部分有指定顺序:请求方法和URL首先到达。然后是请求头,最后是请求主体。

function postMessage(msg){
var request=new XMLHttpRequest();
request.open("post","/log.php");
request.setRequestHeader("Content-Type","text/plain;charset=UTF-8");
request.send(msg);
}

一个完整的HTTP响应有状态码、响应头集合和响应主体组成。这些都可以通过XMLHttpRequest对象的属性和方法使用:

status和statusText属性以数字和文本的形式返回HTTP状态码(200 请求成功 404找不到资源  500)

使用getResponseHeader和getAllResponseHeaders()能查询响应头

响应主体可以从responseText属性中得到文本形式的,从responseXML属性中得到Document形式的、

XMLHttpRequest对象通常异步使用:发送请求后,send方法立即返回,知道响应返回,前面列出的响应方法和属性才有效。为了在响应准备就绪时得到通知,必需监听XMLHttp对象上的readystatechange事件

readyState是一个整数,它指定了HTTP请求的状态

当readyState值改变为4或服务区的响应完成时,所有的浏览器都触发readystatechange事件。因为在响应完成之前也会触发事件,所以事件处理程序应该一直检验readyState值。为了监听readystatechange事件,请把事件处理函数设置为XMLHttpRequest对象的onreadystatechange属性。也能使用addEventListener(或在IE8以及之前版本中使用attachEvent),但通常每个请求只需要一个处理程序,所以只设置onreadystatechange更容易

function getText(url,callback){
var request=new XMLHttpRequest();
request.open("GET",url);
request.onreadystatechange=function(){
if(request.readyState===4&&request.status===200){
var type=request.getResponseHeader("Content-Type");
if(type.mathc(/^text/)){ callback(request.responseText);
} } };
request.send(null);
}

XMLHttpRequest支持同步响应。如果把false作为第三个参数传递给open,那么send方法将阻塞直到请求完成,这这种情况下,不需要使用事件处理程序:一旦send返回,仅需要检查XMLHttpRequest对象的status和responseText属性

function getTextSync(url){
var request=new XMLHttpRequest();
request.open("get",url,false);
request.send(null);
if(requset.status!==200){
throw new Error(request.statusText);
}
var type=request.getResponseHeader("Content-Type");
if(!type.mathc(/^text/)){
throw new Error("expecte textual response;got:"+type); }
return request.responseText;
}
function get(url,callback){
var request=new XMLHttpRequest();
request.open("get",url);
request.onreadystatechange=function(){
if(request.readyState===4&&request.status==200){
var type=request.getResponseHeader("Content-Type");
if(type.indexOf("xml")!==-1&&request.responseXML){
callback(request.responseXML);
}
else if(type==="application/json"){
callback(JSON.parse(request.responseText));
}
else
callback(request.responseText);
} };
request.send(null);
}

你可能希望特殊编码的另一个响应类型是“application/javascript”或者"text/javascript".你能使用XMLHttpRequest请求javaScript脚本,然后使用全局eval();

request.overrideMimeType("text/plain;charset=utf-8");

表单编码的请求

默认情况下,html表单通过post方法发送给服务器,而编码后的表单数据则用做请求主体。对表单数据使用的编码方案相对简单:对每个表单元素的名字和值执行普通的URL编码(使用十六进制转义码替换特殊字符),使用等号把编码后的名字和值分开,并使用&符号分开名/值

find=pizza$zipcode=02134&radius=1km

表单数据编码格式有一个正式的MIME类型

application/x-www-form-urlencoded

当使用post方法提交这个顺序的表单数据时,必需设置“content-type”请求头为这个值

权威指南之脚本化http的更多相关文章

  1. 权威指南之脚本化jquery

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

  2. JavaScript权威设计--JavaScript脚本化文档Document与CSS(简要学习笔记十五)

    1.Document与Element和TEXT是Node的子类. Document:树形的根部节点 Element:HTML元素的节点 TEXT:文本节点   >>HtmlElement与 ...

  3. Java 脚本化编程指南

    Java 脚本化编程指南 Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的 ...

  4. JavaScript权威指南--脚本化CSS

    知识要点 客户端javascript程序员对CSS感兴趣的是因为样式可以通过脚本编程.脚本化css启用了一系列有趣的视觉效果.例如:可以创建动画让文档从右侧“滑入”.创造这些效果的javascript ...

  5. JavaScript权威指南--脚本化文档

    知识要点 脚本化web页面内容是javascript的核心目标. 第13章和14章解释了每一个web浏览器窗口.标签也和框架由一个window对象所示.每个window对象有一个document对象, ...

  6. JavaScript权威指南学习笔记6

    这两天主要翻看了书中的第18-22章,重点看了第17章:事件化处理,其它几章节主要是翻了下书知道有相关的概念,没有真正理解其中的内容,或者没有考虑究竟如何能把里面的内容应用到实际的项目中.说的讽刺一点 ...

  7. 脚本化HTTP

    1.HTTP: 定义:超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协 ...

  8. 《JavaScript权威指南(第6版)(中文版)》PDF

    简介自1996年以来,JavaScript的:权威指南已为JavaScript圣经程序员,程序员指南和全面的参考,以核心语言和客户端JavaScript API的Web浏览器定义.第6版包括HTML5 ...

  9. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

随机推荐

  1. coroutine

    在脚本语言中,coroutine 不是个新鲜词汇,比如 lua 内建 coroutine,python中的greenlet,但在C程序中,并不是太常见. windows 下有 fiber,相关函数为 ...

  2. opennebula auth module ldap

    1,安装net-ldap  addon ruby library for openldap

  3. struts 2 三目运算

    <s:set id="styleList" value="{'default','success','warning'}"/> <s:iter ...

  4. ios 常用宏(copy)

    分享一下我现在用的 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...

  5. 畅通工程续(dijskra+SPFA)

    畅通工程续 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  6. 浅谈hadoop中mapreduce的文件分发

    近期在做数据分析的时候.须要在mapreduce中调用c语言写的接口.此时就须要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后 ...

  7. ubuntu系统下设置静态IP

    改动 /etc/network/interfaces文件 加入下面内容 # The loopback network interface auto lo eth0 iface lo inet loop ...

  8. Ajax框架,DWR介绍,应用,样例

    使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax ...

  9. uva 10051 Tower of Cubes(DAG最长路)

    题目连接:10051 - Tower of Cubes 题目大意:有n个正方体,从序号1~n, 对应的每个立方体的6个面分别有它的颜色(用数字给出),现在想要将立方体堆成塔,并且上面的立方体的序号要小 ...

  10. 十大算法 pagerank 傅里叶变换

    来源于最近阅读的一些链接 首先是介绍十大算法的 http://blog.jobbole.com/70639/ 然后是pageRank算法 http://blog.jobbole.com/23286/ ...