XHR的应用场景

一、简史

IE5.5最早实现XHR,需要通过ActiveXObject创建xhr实例,直到IE7才定义了XMLHttpRequest对象。IE5.5实现XHR之后,其他浏览器紧随其后实现了XHR,直接命名为XMLHttpRequest。早期的XHR能力有限:只能传输文本,上传能力有限,而且不能跨域。为了解决这些问题,W3C于2008年发布了“XMLHttpRequest Level 2”草案。增强了XHR的能力:

(1)支持请求超时。xhr.timeout = 3000

(2)支持传输二进制和文本数据

(3)支持应用重写媒体类型和编码响应

(4)支持监控每个请求的进度事件

(5)支持有效的文件上传

(6)支持安全的跨来源请求

二、跨源资源共享(CORS)

三、通过XHR下载数据

XHR既可以传输文本数据,也可以传输二进制数据。浏览器可以自动为各种原生数据类型提供编码和解码服务,因此在直接将数据传给XHR时就已经编码/解码好了。XHR自动解码支持的数据类型:

(1)ArrayBuffer

固定长度的二进制数据缓冲区

(2)Blob

二进制大对象或不可变数据

(3)Document

html或xml

(4)JSON

js对象

(5)Text

纯文本

浏览器可根据http首部content-type判断适当的数据类型。应用也可在发起XHR请求时显示重写数据类型:

var xhr = new XMLHttpRequest();
xhr.open(‘GET‘, ‘/images/photo.webp‘);
xhr.responseType = ‘blob‘;// 将返回类型设置为Blob

xhr.onload = function(){
    if(this.status == 200){
        var img = document.createElement(‘img‘);
        img.src = window.URL.createObjectURL(this.response);//基于响应创建唯一对象URI
        img.onload = function(){
            window.URL.revokeObjectURL(this.src);// 图片加载完成立即释放对象
        };
        document.body.appendChild(img);
    }
}

四、通过XHR上传数据

五、XHR流式数据传输

流的应用场景很重要,可惜到现在为止没有API来实现XHR流

(1)上传时,send方法只接受完整的载荷

(2)response、responseText、responseXML属性也不是为流设计的

上传时只能通过将文件切分,然后用多个xhr请求迭代上传。

流式下载得到了浏览器有限的支持:

var xhr = new XMLHttpRequest();

xhr.open(‘GET‘, ‘/stream‘);

xhr.seenBytes = 0;

xhr.onreadstatechange = function(){

if(xhr.readyState > 2){

var newData = xhr.responseText.substr(xhr.seenBytes);

// TODO 处理newData

xhr.seenBytes = xhr.responseText.length;

}

};

xhr.send();

缺陷:

需要手工跟踪偏移量,手工切分数据:responseText缓冲了完整的响应,当前请求完成之前无法释放内存。

只能读取文本数据,无法读取二进制数据。

浏览器兼容性:允许读取的数据类型不一致,有的允许text/html,有的只允许application/x-javascript

总之,XHR流实现起来麻烦而效率低,无法在生产环境下使用。

六、实时通知与交付

(1)通过XHR实现定时轮询。客户端定时发起XHR请求,如果服务端有新数据,返回新数据,没有返回空响应。难点在于,最佳的轮询间隔很难把握。需要在效率与消息延迟之间做权衡。

(2)通过XHR实现长轮询。定时轮询很可能造成大量没必要的空检查。可以做这样的改进:没有数据的时候不再立即返回空数据,而是把链接保持一段时间。

(3)WebSocket。HTML5新增的特性,可考虑在高版本浏览器下实现。

目前还是长轮询的解决方案使用的交广泛。

七、参考资料

《web性能权威指南》

《JavaScript高级程序设计》

时间: 2024-10-12 21:51:42

XHR的应用场景的相关文章

angularJS中XHR与promise

angularJS应用是完全运行在客户端的应用,我们可以通过angularJS构建一个不需依赖于后端,同时能够实现动态内容和响应的web应用,angularJS提供了将应用与远程服务器的信息集成在一起的方法 $http服务 angularJS提供了内置的$http服务直接同外部进行通信,$http服务封装了浏览器原生的XMLHttpRequest对象 $http服务只接收一个参数对象,包含了用来生成http请求的配置内容,$http函数返回一个promise对象,具有success和error两

[转]XHR简介

在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的序幕. XHR是一种浏览器API,极大简化了异步通信的过程,开发者并不需要关注底层的实现,因为浏览器会为我们完成这些工作,如连接管理.协议协商.HTTP请求格式化等等.最初版本的XHR能力非常有限,只支持文本传输,处理上传能力也不足,对于跨域请求也不支持.为解决这些问题,W3C于2008年发布了"XML

《好好说话》:常见沟通场景的应对误区与应答思路、应答句式。4星。

全书针对谈话的常见场景,分析双方的本质问题和应答方的常见应对误区.应该的应答思路与句式.对沟通双方的思路的分析比较有功力. 感觉是从大专辩论赛的角度来组织全书的结构的.我更同意马东在序言中的说法,这本书更应该叫<好好思考>.不过如果从“好好思考”的角度来写书,全书的结构和重点要做一些变化. 书中把语言沟通的五种常见场景(沟通.说服.谈判.演讲.辩论)称作五个维度,还画了一个五边形,我认为这是全书最大的败笔,这里说“五种场景”比“五个维度”跟合适,用表格比用五边形更合适. 个人感觉:在大部分的场

淘宝网的质量属性的场景描述

质量属性 可用性 简单介绍 系统应能长期稳定地提供服务,近似7 X 24小时工作强度: 在负载过重或是系统崩溃的情况下,能保证用户请求不丢失: 当系统出现故障或崩溃时,恢复时间不超过两小时: 场景部分 可能的值 刺激源 业务快速发展 刺激 PHP模式易开发.难维护 制品 淘宝的网页 环境 更换技术 相应 改PHP为Java, 改MySql为oracle 相应度量 2004年开始稳定的供其使用 质量属性 可修改性 简单介绍 修改某个子系统或服务时,不影响其他子系统或服务: 场景部分 可能的值 刺激

小程序的使用场景及用途分析

今天看了小程序的介绍,仔细研究了一番,忽然有了这么一个想法,小程序是口碑传播的大杀器. 小程序依托于微信,先看下张小龙对于这两个的表述 我认为微信是一个工具,这是一个非常庞大的目标,我不认为工具是低层面的东西,事实上,人类从原始人进化到现在正是因为会使用工具.工具有好坏之分,要做一个非常好的工具难度是非常大的. 希望微信及微信相关的产品希望它展现给用户的是更有价值是他所需要的东西,用完即走体现在微信的方方面面,帮助用户提高它的效率,缩短他完成一个任务所需要的时间. 小程序是一个不需要下载安装就可

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.k

《虚拟人》:准科幻,讨论人的记忆与思维能力能够复制到机器之后的种种场景。3星。

感觉实质内容更像科幻小说(形式上不像).一开始判断人类将可以把大脑中的记忆与思维能力复制到软件,后面大部分都基于这个假设来讨论由此带来的社会.法律.宗教方面的各种可能出现的场景.3星. 以下是书中一些内容的摘抄: 1:事实上,有人与我持相同看法.本书内容大部分来自2003—2011年间我赞助过的座谈会和研讨会,书中观点参考了当今诸多颇具创造性.技术性和科学性的研究先锋们的观点.#286 2:“有重要证据显示,人类不是唯一拥有能够产生意识神经基质的物种.非人类动物,包括所有哺乳动物和鸟类.许多其他

HTTPS 原理剖析与项目场景

最近手头有两个项目,XX导航和XX产业平台,都需要使用HTTPS协议,因此,这次对HTTPS协议做一次整理与分享. 为什么使用HTTPS HTTP 协议,本身是明文传输的,没有经过任何安全处理.那么这个时候就很容易在传输过程中被中间者窃听.篡改.冒充等风险.这里提到的中间者主要指一些网络节点,是用户数据在浏览器和服务器中间传输必须要经过的节点,比如 WIFI 热点,路由器,防火墙,反向代理,缓存服务器等. HTTP 协议,中间者可以窃听隐私,使用户的敏感数据暴露无遗:篡改网页,例如往页面插的广告

Android 原生开发、H5、React-Native使用利弊和场景技术分享

http://m.blog.csdn.net/article/details?id=51778086 发表于2016/6/28 18:52:46  1176人阅读 最近工作中接触到React-Native框架,对其进行一些技术分析,结合之前了解的H5的一部分,加上自己做了很久的原生开发(十几个android app.sdk,包括2个ios), 总结下目前了解到的这三种移动端应用开发方式的特点和试用范围,作为个人知识的记录,也作作为公司内部互相学习的分享. 一.原生开发   原生开发是系统自带的a