基于Chrome Socket的XMLHttpRequest

之前在开发 Chrome OS 系统下的快盘文件系统时发现使用 Chrome 自带的 XMLHttpRequest 存在一些限制:

使用 jQuery 实现的 XHR 碰到 HTTP 302 redirect 等特殊的请求时浏览器会自动处理(例如:自动重定向),在 Chrome App 模式下会被限制,如果需要得到重定向的地址就不好实现,此时可以考虑用 Chrome Socket 来实现完整的 HTTP 协议请求。

有关 Chrome Socket 即 chrome.sockets.tcp 的说明可以参考这里:

https://developer.chrome.com/apps/sockets_tcp

后来发现网上已经有人实现了一个还算完整的基于 Chrome Socket 的 XMLHttpRequest:

https://github.com/ahmadnassri/chrome.sockets.tcp.xhr

经过实际使用之后发现这个 XHR 类确实实现了基本的 HTTP 协议,但实际使用时还是有点问题,因此我在此项目基础上做了一些改进:

  • 原 chrome.sockets.tcp.xhr 不支持获取完整的 HTTP 响应内容,只能得到第一次接收到的数据,这样对于需要返回大量数据的下载等操作是不能接受的;
  • 增加重定向判断,支持直接返回 HTTP 302 重定向的目标地址;
  • 支持设置第一次接收到数据的超时;
  • 支持所有接收的数据通过 ArrayBuffer 返回。

修改过的基于 Chrome Socket 的 XMLHttpRequest 代码我放在这里了:

https://github.com/zohead/chrome.sockets.tcp.xhr

chrome.sockets.tcp.xhr 的使用文档可以参考这里:

http://chromesocketstcpxhr.readthedocs.org/en/latest/

修改之后的使用方法与这个文档里的基本一致,增加的部分例如可以通过 recvTimeout 属性指定第一次接受到数据的超时:

var xhr = new chrome.sockets.tcp.xhr();
xhr.recvTimeout = 3500;
xhr.open('GET', 'http://google.com:80');
xhr.setRequestHeader('X-Requested-With', 'chrome.sockets.tcp.xhr');
xhr.send(null);

上面的代码就表示连接成功之后如果 3.5 秒之内没有接收到数据就认为超时断开连接。

由于此 chrome.sockets.tcp.xhr 项目功能实现的还不是特别完整,如果此项目使用中发现有什么问题欢迎提出并 fork 修改哦~~~

基于Chrome Socket的XMLHttpRequest》上的评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*