`
足至迹留
  • 浏览: 492777 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<6>脚本化http( XMLHttpRequest)

 
阅读更多
六、脚本化http( XMLHttpRequest)
超文本传输协议规定web浏览器如何从web服务器获取文档和向web服务器提交表单内容,以及web服务器如何应如何响应这些请求和提交。Web浏览器会处理大量http。通常,http并不在脚本的控制下,只是当用户单击链接,提交表单和输入url时才发生。

Ajax描述了一种主要使用脚本操纵http和web服务器进行数据交换,不会导致页面重载。避免页面重载的能力使得web应用感觉更像传统的桌面应用。Web应用可以使用Ajax技术把用户的交互数据记录到服务器中,也可以开始只显示简单页面,之后按需要加载额外的数据和页面组件来提升应用的启动时间。

Comet是使用脚本操纵http的web应用架构相关的术语。某种意义上,comet和ajax相反。在Comet中,web服务器发起通信并异步发送消息到客户端。在Ajax中,客户端从服务器拉数据,而在Comet中,服务器向客户端推数据。

<script>元素的src属性能设置url并发起http get请求。使用<script>元素实现脚本操纵http是非常吸引人的,因为他们可以跨域通信二不受限制于同源策略。通常,使用基于<script>的ajax传输协议时,服务器的响应采用json编码的数据格式,当执行脚本时,javascript解析器能自动将其解码。由于它使用JSON数据格式,因此这种Ajax传输协议也叫做“JSONP”.
虽然在<iframe>和<script>传输协议之上能实现Ajax技术,但通常还有更简单的方式。一段时间以来,所有浏览器都支持XMLHttpRequest对象,它定义了用脚本操纵HTTP的API。除了常用的GET请求,还包含实现POST,HEAD等请求的能力,同时他能用文本或Document对象的形式返回服务器的响应。虽然它名字叫XMLHttpRequest API,但并没有限制只能使用xml文档,它能获取任何类型的文本文档。

使用XMLHttpRequest

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

Step0:创建对象 request
使用这个HTTP API必须做的第一件事就是实例化XMLHttpRequest对象:
Var request = new XMLHttpRequest();

记住,每个实例表示一个独立的请求响应对,如果重用已存在的XMLHttpRequest,将会终止之前这个对象之前的任何请求。

Step1:指定请求 open()
创建XMLHttpRequest对象之后,发起HTTP请求的下一步是调用XMLHttpRequest对象的open()方法去指定这个请求的两个必须部分:方法和url。
Request.open(“GET”,       // 开始一个http get请求
“data.csv”);   // url,请求的地址

Open()的第一个参数是指定http方法会或动作。这个字符串不区分大小写,但通常用大写字母匹配http协议。“get”和“post”方法是得到广泛支持的。Get用于常规请求,适合于当url完全指定请求资源,当请求对服务器没有任何副作用以及当服务器的响应是可缓存的。POST方法常用语html表单,它在请求主体中包含额外的数据(表单数据),且这些数据常存储到服务器中(副作用)。相同url的重复post请求从服务器得到的响应可能不同,同时不应该缓存使用这个方法的缓存。
除了get和post之外,XMLHttpRequest规范也允许把delete,head,options和put作为open()的第一个参数。

Open的第二个参数是url,它是请求的主体。这是相对于包含open()脚本的document的url。如果指定绝对url,协议,主机和端口号通常必须匹配所在文档的对应内容,跨域的请求通常会报错。

Open的第三个参数是布尔值,代表请求是同步还是异步,默认为true,是异步的,设为false代表同步的。设成异步的就不要给XMLHttpRequest设置readystatechange事件响应函数了,直接可以取得响应消息。但是,客户端javascript是单线程的,这样会导致阻塞,整个浏览器UI冻结,谨慎使用。


Step3:设置请求头 ,setRequestHeader()
如果有请求头的话,请求进程的下一步就是设置它,如post请求需要“Content-Type”指定请求主体的MIME类型:
Request.setRequestHeader(“Content-Type”, “text/plain”);
如果对相同的头调用setRequestHeader()多次,新值不会取代之前指定的值,相反,http请求将包含这个头的多个副本或这个头将指定多个值。

不能自己指定“Content-Length”,”Date”,”Refer”或”User-Agent”头,XMLHttpRequest将自己添加这些头防止伪造他们。类似地,XMLHttpRequest对象自动处理cookie,连接时间,字符集和编码判断,程序员无法向setRequestHeader()传递这些头:



如果请求一个受密码保护的url,把用户名和密码作为第四个和第五个参数传递给open。

Step4: 发送请求 send()
使用XMLHttpRequest发起http请求的最后一步是指定可选的请求主体并向服务器发送它。
Request.send(null);
Get请求绝对没有主体。所以应该传递null或省略这个参数。
POST请求通常拥有主体,同时它应该匹配用setRequestHeader指定的“Content-Type”头。

顺序问题:
http请求的各部分有指定顺序,请求方法和url先到达,然后是请求头,最后是请求主体。XMLHttpRequest实现通常直到调用send()方法才开始启动网络,但顺序必须匹配,如setRequestHeader必须在open之后和send之前,否则将抛出异常。

2. 取得响应
一个完整的http响应由状态码,响应头集合和响应主体责成,这些都可以通过XMLHttpRequest对象的属性和方法获得。
1) status和statusText属性以数字和文本的形式返回http状态码。
2) 使用getResponseHeader()和getAllResponseHeaders()能查询响应头。
3) 响应主体可以从responseText属性中得到文本形式的,从responseXML属性中得到Document形式的(它实际对XHtml和xml文档都有效)。

XMLHttpRequest通常异步使用,发送请求后,send()方法立即返回,知道响应返回勤勉列出的响应方法和属性才有效。为了在响应准备就绪时得到通知,必须监听XMLHttpRequest对象上的readystatechange事件,对应readyState属性的变化。
readyState是一个整数,指定了http请求的状态,为4时代表响应完全返回。

为了监听readystatechange事件,把事件处理函数设置为XMLHttpRequest对象的onreadystatechange属性。



1. 响应解码
前面我们假设服务器使用像“text/plain”,”text/html”或“text/css”这样的MIME类型发送文本响应,然后我们使用XMLHttpRequest对象的responseText属性得到它。

但是还有其他方式来处理服务器响应。如果服务器发送xml或xhtml文档作为响应,能通过responseXml属性获得一个解析形式的xml文档。这个属性的值是一个document对象,可以使用前面介绍的技术搜索和遍历操作。

如果服务器想发送诸如对象或数组这样的结构化数据作为响应,应该传输JSON编码(“application/json”)的字符串数据。接收它时,可以把responseText属性传递给JSON.parse()。

如果期望响应的类型是”application/javascript”或”text/javascript”,这种情况下不需要使用XMLHttpRequest对象,因为<script>本身完全可以实现加载并执行脚本。而且,<script>可以发起跨域http请求,而XMLHttpRequest API则禁止。

Web服务器端通常使用二进制数据(如图片,文件)响应http请求,responseText属性只能用于文本。目前还没有一个统一各浏览器处理的成熟方法,可以参考:http://stackoverflow.com/questions/4376657/is-there-any-way-to-send-binary-data-with-xmlhttprequest-object

服务器响应的正常解码是假设服务器为这个响应发送了“Content-Type”头和正确的MIME类型。

2. 编码请求主体
HTTP POST请求包括一个请求主体,它包含客户端传递给服务器的数据。

3.1 表单编码的请求
当用户提交html表单时,表单中的数据(每个表单元素的名字和值,因此也要求表单元素必须有name和value属性)编码到一个字符串中并随请求发送。默认情况下,html表单通过post方法发送给服务器,而编码后的表单数据则用作请求主体。编码方法是:对每个表单元素的名字和值执行普通的url编码(使用十六进制转移码替换特殊字符),使用等号把编码后的名字和值分开,并使用”&”分开名/值对。如:
Find=pizza&zipcode=2323&radius=1km

表单编码格式有一个正式的MIME类型:
application/x-www-form-urlencoded
当使用post方法提交这种顺序的表单数据时,必须设置“Content-Type”为这个值。

表单数据同样可以通过GET请求来提交,当知识为了执行只读查询,get请求比post请求更合适。

3.2 JSON编码的请求
Html form并不是http提交的必须类型,现在作为web交换格式的JSON已经得到普及,可以使用JSON.stringify()对请求主体编码。



3.3 Multipart/form-data请求
当html表单同时包含文件上传元素和其他元素时,浏览器不能使用普通的表单编码而必须使用称为”multipart/form-data”的特殊content-Type来用post方法提交。这种编码使用长边界字符串把请求主体分离成多个部分,对于文本数据,手动创建”multipart/form-data”请求主体是可能的,但很复杂。

XHR2定义了新的FormData api,容易实现多部分请求主体。首先,使用构造函数创建FormData对象,然后按需多次调用对象的append()方法把各部分添加到请求中,最后,把FormData对象传递给send()方法。
3. 中止请求和超时abort
可以通过调用XMLHttpRequest对象的abort()方法来取消正在进行的http请求。Abort()方法在所有的XMLHttpRequest版本和XHR2中可用,调用方法时触发abort事件。


4. 跨域http请求
作为同源策略的一部分,XMLHttpRequest对象通常仅可以发起和文档具有相同服务器的http请求。这个限制关闭了安全漏洞,但阻止了大量合适使用的跨域请求。可以在<form>和<iframe>中使用跨域url,而浏览器显示最终的跨域文档,但浏览器不允许原始脚本查找跨域文档的内容。使用XMLHttpRequest,文档内容都是通过responseText属性暴露,所以同源策略不允许XMLHttpRequest进行跨域请求。因此,<script>也取代了XMLHttpRequest成为主流Ajax传输协议。

借助<script>发送http请求:JSONP
只需设置<script>元素的src属性(加入它还没插入到document中,需要插入进去),然后浏览器会发送一个请求以下载src属性所指向的url。使用<script>元素进行Ajax传输的一个主要原因是,它不受同源策略的影响,因此可以使用它们从其他的服务器请求数据,第二个原因是包含JSON编码数据的响应体会自动解码(即执行)。

这种使用<script>元素作为Ajax传输的技术称为JSONP,若http请求所得到的响应数据时经过json编码的,则适合使用该技术。

当通过<script>元素调用数据时,响应内容必须用javascript函数名和圆括号包裹起来,而不是发送这样一段JSON数据:
[1, 2, {“buckle”:”my shoe”}]
应该发送这样一个包裹后的JSON响应:
handleResponse(
[1, 2, {“buckle”:”my shoe”}]
)

包裹后的响应会成为<script>元素的内容,它先判断JSON编码后的数据(毕竟是一个javascript表达式),然后把它传递给handleResponse()函数。

为了可行起见,我们必须通过某种方式告诉服务,它正在从一个<script>元素调用,必须返回一个JSONP响应,而不是普通的JSON响应。这个可以通过在URL中添加一个查询参数实现,例如追“?jsonp”(或“&jsonp”)。

在实践中,支持JSONP的服务不会强制指定客户端必须实现的回调函数名称,比如handleResponse。相反,他们使用查询参数的值,允许客户端指定一个函数名(如:?jsonp=callback)。
还可以参考:
http://www.w3cmm.com/ajax/jsonp.html
http://www.cnblogs.com/jkswjw/p/3173758.html
  • 大小: 23.7 KB
  • 大小: 89.7 KB
  • 大小: 38.5 KB
分享到:
评论

相关推荐

    jquery-1.1.3 效率提高800%

    &lt;br&gt;Opera 9.1 3196ms 326ms 980% &lt;br&gt;Average improvement: 867% &lt;br&gt;&lt;br&gt;下表为jQuery1.1.3与常用的一些JS库选择器的对比:&lt;br&gt;Browser Prototype jQuery Mootools Ext Dojo &lt;br&gt;IE 6 1476ms 661ms 1238ms 672ms ...

    图书网联系我们页面html实现

    2. 布局元素:使用`&lt;header&gt;`、`&lt;nav&gt;`、`&lt;section&gt;`、`&lt;article&gt;`、`&lt;aside&gt;`和`&lt;footer&gt;`等语义化标签来组织页面内容,使页面结构清晰且利于SEO。 3. 内容展示:`&lt;h1&gt;`至`&lt;h6&gt;`用于标题,`&lt;p&gt;`用于段落,`&lt;img&gt;`...

    html练习题

    4. 文本格式化:`&lt;strong&gt;`和`&lt;em&gt;`分别用于加粗和斜体;`&lt;code&gt;`用于展示代码片段;`&lt;pre&gt;`保留文本格式,常用于显示代码块。 5. 链接:`&lt;a&gt;`标签创建超链接,`href`属性定义目标URL,`target`属性指定链接打开...

    html学习资料源码练习

    2. 文本格式化标签:如`&lt;h1&gt;`至`&lt;h6&gt;`(标题)、`&lt;p&gt;`(段落)、`&lt;b&gt;`和`&lt;i&gt;`(粗体和斜体)、`&lt;em&gt;`和`&lt;strong&gt;`(强调和重要性)等。 3. 链接标签:`&lt;a&gt;`用于创建链接,可以跳转到其他页面或资源。 4. 图像标签:`...

    网站后台管理系统

    6. **语义化**:现代HTML强调语义化,比如使用`&lt;main&gt;`、`&lt;figure&gt;`、`&lt;figcaption&gt;`等标签,提高内容的可读性和可访问性,有利于搜索引擎优化(SEO)和辅助技术(如屏幕阅读器)的使用。 7. **外部资源引用**:...

    Html入门和网络编程技术

    此外,`&lt;div&gt;`和`&lt;span&gt;`作为布局和样式控制的容器元素,它们在页面结构化中起到关键作用。 了解HTML的同时,我们不能忽视与之紧密相关的CSS。CSS用于控制网页的样式和布局,使我们能够实现颜色、字体、间距、大小...

    content_1652315754004.zip

    6. **DOM(文档对象模型)**:DOM是HTML和XML文档的结构化表示,允许通过JavaScript或其他脚本语言动态操作网页内容。通过DOM,可以添加、删除或修改元素,实现交互性和动态效果。 7. **事件处理**:HTML与...

    XML在线相册

    `&lt;id&gt;`代表照片的唯一标识,`&lt;title&gt;`是照片的标题,`&lt;description&gt;`提供了详细描述,`&lt;date&gt;`记录了拍摄日期,`&lt;location&gt;`指明了地点,而`&lt;thumbnail&gt;`和`&lt;fullimage&gt;`分别存储了缩略图和原图的URL或路径。...

    达内JAVA TTS5.0 PDF----HTML--CCS--JS

    2. 标签使用:如`&lt;head&gt;`, `&lt;body&gt;`, `&lt;h1&gt;`, `&lt;p&gt;`, `&lt;a&gt;`等,以及语义化标签如`&lt;header&gt;`, `&lt;nav&gt;`, `&lt;section&gt;`等。 3. 图片和链接:如何插入图片`&lt;img&gt;`,创建链接`&lt;a&gt;`。 4. 表格与列表:`&lt;table&gt;`,`&lt;tr&gt;`, `...

    网页制作完全手册,HTML帮助文档

    此外,`&lt;section&gt;`、`&lt;article&gt;`和`&lt;header&gt;`等语义化元素,有助于搜索引擎优化和无障碍访问。 JavaScript(简称JS)是与HTML紧密相关的脚本语言,常用于增加网页的交互性。它可以操作DOM(文档对象模型),改变...

    基于XML的网络相册

    每个`&lt;photo&gt;`元素内可以包含图片的文件名(`&lt;filename&gt;`)、大小(`&lt;size&gt;`)、上传日期(`&lt;uploadDate&gt;`)和描述(`&lt;description&gt;`)等信息。 为了实现这个功能,开发者通常会使用前端技术(如HTML、CSS和...

    VBA处理网页基础二.doc

    Do While ie.Busy Or ie.ReadyState &lt;&gt; READYSTATE_COMPLETE DoEvents Loop Set htmlDoc = ie.Document title = htmlDoc.getElementsByTagName("title")(0).innerText ``` 2. **使用XMLHttpRequest对象**: ...

    DOM操作XML文档向表格添加数据.rar

    3. **遍历XML节点**:在解析完XML文档后,遍历`&lt;employee&gt;`元素,提取数据并创建新的表格行(`&lt;tr&gt;`)和单元格(`&lt;td&gt;`)。 ```javascript let employeeList = xmlDoc.getElementsByTagName("employee"); let ...

    AJAX操作数据

    str += "&lt;tr&gt;&lt;td&gt;" + lie[0] + "&lt;/td&gt;&lt;td&gt;" + lie[1] + "&lt;/td&gt;&lt;td&gt;" + lie[2] + "&lt;/td&gt;&lt;td&gt;" + lie[3] + "&lt;/td&gt;&lt;td&gt;" + lie[4] + "&lt;/td&gt;&lt;td&gt;&lt;input type='button' class='shanchu' code='" + lie[0] + "' /&gt;&lt;/td&gt;&lt;/...

    城建管理信息平台 html

    2. **语义化标签**:为了提高可读性和可访问性,HTML5引入了许多语义化的标签,如&lt;header&gt;、&lt;nav&gt;、&lt;section&gt;、&lt;article&gt;和&lt;footer&gt;等。这些标签有助于搜索引擎理解页面内容,同时对屏幕阅读器用户友好。 3. **表格...

    HTML和JavaScript语法一览

    6. **HTML5新增元素**:HTML5引入了更多语义化元素,如`&lt;header&gt;`、`&lt;footer&gt;`、`&lt;section&gt;`和`&lt;article&gt;`,提高了网页的可读性和可访问性。 **JavaScript语法** JavaScript是一种脚本语言,负责网页的动态效果和...

    project71-a-源码

    头部&lt;head&gt;包含元数据,如标题、样式表链接和脚本引用;主体&lt;body&gt;则包含网页的实际内容。 2. **HTML标签**:HTML标签用于定义网页元素,如&lt;h1&gt;到&lt;h6&gt;定义标题,&lt;p&gt;定义段落,&lt;a&gt;定义超链接,&lt;img&gt;插入图像,&lt;ul&gt;和...

    web基础知识

    \n\n2.3 HTML链接、图像和表格\n- `&lt;a&gt;`标签用于创建超链接,如`&lt;a href="http://example.com"&gt;链接文本&lt;/a&gt;`。\n- `&lt;img&gt;`标签插入图像,如`&lt;img src="image.jpg" alt="图片描述"&gt;`。\n- `&lt;table&gt;`元素用于创建表格...

    xml作业二第三题-编写一个课程表网页,当鼠标悬停或点击课程名称时,弹出课程介绍窗口

    可以使用表格元素`&lt;table&gt;`,以及行`&lt;tr&gt;`和单元格`&lt;td&gt;`来组织课程信息: ```html &lt;table id="courseTable"&gt; &lt;tr&gt; &lt;th&gt;课程名称&lt;/th&gt; &lt;th&gt;教师&lt;/th&gt; &lt;th&gt;时间&lt;/th&gt; &lt;/tr&gt; &lt;!-- 动态生成的课程行... --&gt; &lt;/...

Global site tag (gtag.js) - Google Analytics