XHR全称XMLHttpRequest

XMLHTTP是一组API函数集,可被JavaScript、JScript、VBScript以及其它web浏览器内嵌的脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。XMLHTTP最大的好处在于可以动态地更新网页,它无需重新从服务器读取整个网页,也不需要安装额外的插件。该技术被许多网站使用,以实现快速响应的动态网页应用。例如:Google的Gmail服务、Google Suggest动态查找界面以及Google Map地理信息服务。

XMLHTTP是AJAX网页开发技术的重要组成部分。

除XML之外,XMLHTTP还能用于获取其它格式的数据,如JSON或者甚至纯文本。

在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程。XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的序幕。

XHR是一种浏览器API,极大简化了异步通信的过程,开发者并不需要关注底层的实现,因为浏览器会为我们完成这些工作,如连接管理、协议协商、HTTP请求格式化等等。最初版本的XHR能力非常有限,只支持文本传输,处理上传能力也不足,对于跨域请求也不支持。为解决这些问题,W3C于2008年发布了“XMLHttpRequest Level2”草案,新增了如下功能:

  • 支持请求超时;
  • 支持传输二进制和文本数据;
  • 支持重写媒体类型和编码响应;
  • 支持监控每个请求的进度事件;
  • 支持有效的文件上传;
  • 支持安全的跨来源请求。

2011年,W3C将“XMLHttpRequest Level2”规范与最初的“XMLHttpRequest”规范合并,所有XHR2新增的功能也都并入了原来的XHR API中,接口不变,功能增强。

1.XHR简介

XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。XHR接口强制要求每个请求都具备严格的HTTP语义–应用提供数据和URL,浏览器格式化请求并管理每个连接的完整生命周期,所以XHR仅仅允许应用自定义一些HTTP首部,但更多的首部是不能自己设定的,如:

  • Accept-Charset, Accept-Encoding, Access-Control-*
  • Host, Upgrade, Connection, Referer, Origin
  • Cookie, Sec-, Proxy-, 及其他首部

浏览器会拒绝绝对不安全的首部重写,以保证应用不能假扮用户代理、用户或请求来源,如Origin由浏览器自动设置,Access-Control-Allow-Origin由服务器设置,如果接受该请求,不包含该字段即可,浏览器发出的请求将作废。

  • CORS请求会省略cookie和HTTP认证等用户凭据;
  • 客户端被限制只能发送“简单的跨域请求”,包括只能使用GET POSD HEAD三种方式,只能访问通过XHR发送并读取的HTTP首部。

如果想要启用cookie和HTTP认证,客户端必须在发送请求时通过XHR对象发送额外的属性(withCredentials),而服务器也需要以Access-Control-Allow-Credentials响应,表示允许应用发送隐私数据。同样,如果客户需要写入或读取自定义HTTP标头或想要使用“非简单的方法”的请求,那么它必须首先通过发出一个预备请求,以获取第三方服务器的许可,如下所示:

// Preflight request
OPTIONS /resource.js HTTP/1.1
Host: thirdparty.com
Origin: http://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: My-Custom-Header
...// Preflight response
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: My-Custom-Header
...(actual HTTP request)

W3C CORS规范定义的什么时候必须使用预备请求,“简单”的请求可以跳过它,但也有各种各样场景需要使用预备请求,这就添加一次往返网络延迟。可喜的是,一旦预备请求完成,它可以由客户端缓存,以避免在后续请求进行相同的验证。

在XHR中,可以通过responseType-设置改变响应类型,如下所示:

  • “” 字符串(默认值)
  • “arraybuffer” ArrayBuffer
  • “blob” Blob
  • “document” Document
  • “json” JavaScript 对象,解析自服务器传递回来的JSON 字符串。
  • “text” 字符串

2.数据传输

2.1.数据请求:

下面是通过XHR获取一张图片,并显示到网页上的示例:

var xhr = new XMLHttpRequest();xhr.addEventListener("progress", updateProgress, false);
xhr.addEventListener("load", transferComplete, false);
xhr.addEventListener("error", transferFailed, false);
xhr.addEventListener("abort", transferCanceled, false);xhr.open('GET', '/images/photo.webp');
xhr.responseType = 'blob';
xhr.onload = function() {if (this.status == 200) {var img = document.createElement('img');img.src = window.URL.createObjectURL(this.response);img.onload = function() {window.URL.revokeObjectURL(this.src);}document.body.appendChild(img);}
};xhr.send();

2.2.数据上传

上传相关事件在 XMLHttpRequest.upload 对象上被触发,像下面这样,向服务器发送一个formdata格式数据:

var formData = new FormData();
formData.append('id', 123456);
formData.append('topic', 'performance');var xhr = new XMLHttpRequest();xhr.upload.addEventListener("progress", updateProgress);
xhr.upload.addEventListener("load", transferComplete);
xhr.upload.addEventListener("error", transferFailed);
xhr.upload.addEventListener("abort", transferCanceled);xhr.open('POST', '/upload');
xhr.onload = function() { ... };
xhr.send(formData);

2.3.数据分片上传:

var blob = ...;const BYTES_PER_CHUNK = 1024 * 1024;
const SIZE = blob.size;var start = 0;
var end = BYTES_PER_CHUNK;while(start < SIZE) {var xhr = new XMLHttpRequest();xhr.open('POST', '/upload');xhr.onload = function() { ... };xhr.setRequestHeader('Content-Range', start+'-'+end+'/'+SIZE);xhr.send(blob.slice(start, end));start = end;end = start + BYTES_PER_CHUNK;
}

注意:progress 事件在使用 file: 协议的情况下是无效的。

xhr XMLHttpRequest 简介相关推荐

  1. XMLHttpRequest简介

    XMLHttpRequest 简介 要真正实现这种绚丽的奇迹,必须非常熟悉一个 JavaScript 对象,即 XMLHttpRequest.这个小小的对象实际上已经在几种浏览器中存在一段时间了,它是 ...

  2. XHR(XMLHttpRequest)与Linux下的CGI交互

    在Web编程时,为了能与硬件交互,中间需要CGI来响应.一般的我们会采用Form的Action来与CGI交互,但是使用Form来交互,就必须要提交数据,要提交数据就会产生页面的刷新,如果是少量的,还可 ...

  3. 异步请求之XMLHttpRequest篇

    XMLHttpRequest 简介 XMLHttpRequest对象可以实现页面无刷新来实现与服务端进行数据交互.最先有微软公司设计,随后被Google,Mozilla等使用.现在已成为异步请求的标准 ...

  4. javascript --- XHR(XMLHttpRequet)对象

    XHR: // XHR(XMLHttpRequest):为向服务器发送请求和解析服务器响应提供了流畅的接口 // 能够以异步方式从服务器取得更多信息,意味着用户点击后,可以不必刷新页面也能取得新数据 ...

  5. js xmlhttp ajax 超时时间,如何为XMLHttpRequest设置超时和ontimeout?

    覆盖XMLHttpRequest用自己的版本. 我不建议这样做,但有时如果您需要直接与使用XMLHttpRequest的代码集成,您可能会觉得您需要这样做.例如: (function() { var ...

  6. AJAX核心对象-- XMLHttpRequest 对象使用详解 (一)

    作者:Brett McLaughlin 多数 Web 应用程序都使用请求/响应模型从服务器上获得完整的HTML 页面.常常是点击一个按钮,等待服务器响应,再点击另一个按钮,然后再等待,这样一个反复的过 ...

  7. JavaScript XHR使用 JSONPlaceholder API 并本地搭建JSON server REST API

    有时,了解地面上的事情是如何发生的非常重要.本文将讨论如何借助最喜爱的 REST API 在 vanilla JavaScript 中使用 XHR - XMLHttpRequest:JSON占位符. ...

  8. JS原生:XMLHttpRequest发送GETPOST请求

    目录 1.XMLHttpRequest   (xhr) 2.使用xhr发起GET无参请求 3.使用xhr发起GET有参请求 4.使用xhr发起POST请求 学到了xhr发起GET和POST请求,在此记 ...

  9. xhr返回值_XHR对象

    一.XMLHttpRequest对象 var xhr = newXMLHttpRequest(), i= 0;for(var key inxhr){if(xhr.hasOwnProperty(key) ...

最新文章

  1. iconv文件编码判断转换
  2. 如何在Windows下编译OpenSSL?
  3. 【博客话题】我与Linux的不解情缘
  4. 【视频】vue组件之props属性
  5. 拖链电缆 机器人电缆_trvv高柔性拖链电缆
  6. USART_GetITStatus和USART_GetFlagStatus的区别
  7. Effective Java之避免使用受检的异常(五十九)
  8. leetcode437. 路径总和 III
  9. 常用SQL语句优化技巧
  10. windbg调试句柄泄露
  11. MacOS Monterey 12.3.1(21E258) OC 0.7.9 / Cl 5145 / PE 三分区原版黑苹果镜像
  12. PC批量转换网易ncm音乐
  13. 外贸常见的付款方式你了解吗?
  14. PhotoShop 各历史版本
  15. Word2013设置多级标题自动编号
  16. 2022年第四届河南省CCPC大学生程序设计竞赛代码+简单思路(退役战了算是,还好金了)
  17. 爬有道在线翻译(已完善)
  18. 网络安全工程师就业前景
  19. 【初识大数据】4、大数据学习路线
  20. C/C++基础面试试题大全

热门文章

  1. FD.io/VPP — VPP 的安装部署
  2. OpenStack 实现技术分解 (5) 应用开发 — 使用 OpenStackClients 进行二次开发
  3. 不确定函数参数个数时的处理,va_start和va_end使用详解
  4. 180W多路输出式单片精密开关电源电路及分析
  5. mysql基于传统的log_file及log_pos主从复制
  6. 推荐一些顶级的开源CI/CD工具
  7. 打造出移动人体广告,变衣科技完成千万元级Pre-A轮融资
  8. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D
  9. Caused by: java.lang.ClassNotFoundException: javax.persistence.Entity
  10. [android] 异步http框架与实现原理