1. XMLHttpRequest 对象

构造函数定义:

  1. let xhr = new XMLHttpRequest();

1.1 使用 XHR

open()方法
三个参数:

  • 请求类型
  • 请求 URL
  • 是否异步的布尔值
  1. xhr.open("get", "example.php", false);

调用 open()不会实际发送请求,只是为发送请求做好准备。
注意:只能访问同源 URL,也就是域名相同、端口相同、协议相同。如果请求的 URL 与
发送请求的页面在任何方面有所不同,则会抛出安全错误。

send()方法
一个参数:要发送的数据
如果不发送请求体,必须填入null

  1. xhr.open("get", "example.txt", false);
  2. xhr.send(null);

XHR对象有一个readyState 属性,表示当前处在请求/响应过程的哪个阶段

  • 0:未初始化(Uninitialized)。尚未调用 open()方法。
  • 1:已打开(Open)。已调用 open()方法,尚未调用 send()方法。
  • 2:已发送(Sent)。已调用 send()方法,尚未收到响应。
  • 3:接收中(Receiving)。已经收到部分响应。
  • 4:完成(Complete)。已经收到所有响应,可以使用了。
  1. let xhr = new XMLHttpRequest();
  2. //每次 readyState 从一个值变成另一个值,都会触发 readystatechange 事件
  3. xhr.onreadystatechange = function() {
  4. if (xhr.readyState == 4) {
  5. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
  6. alert(xhr.responseText);
  7. } else {
  8. alert("Request was unsuccessful: " + xhr.status);
  9. }
  10. }
  11. };
  12. xhr.open("get", "example.txt", true);
  13. xhr.send(null);

1.2 HTTP 头部

XHR 请求会发送以下头部字段
【网络请求与远程资源】 - 图1
setRequestHeader()方法
两个参数:头部字段的名称和值
为头部增加额外的数据

1.3 GET 请求

必要时,需要在 GET 请求的 URL面添加查询字符串参数
格式:查询字符串中的每个名和值都必须使用encodeURIComponent()编码,所有名/值对必须以和号(&)分隔

  1. xhr.open("get", "example.php?name1=value1&name2=value2", true);

可以定义一个函数自动生成URL

  1. function addURLParam(url, name, value) {
  2. url += (url.indexOf("?") == -1 ? "?" : "&");
  3. url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
  4. return url;
  5. }
  6. let url = "example.php";
  7. // 添加参数
  8. url = addURLParam(url, "name", "Nicholas");
  9. url = addURLParam(url, "book", "Professional JavaScript");
  10. // 初始化请求
  11. xhr.open("get", url, false);

1.4 POST 请求

POST 请求的请求体可以包含非常多的数据,而且数据可以是任意格式。

  1. function submitData() {
  2. let xhr = new XMLHttpRequest();
  3. xhr.onreadystatechange = function() {
  4. if (xhr.readyState == 4) {
  5. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
  6. alert(xhr.responseText);
  7. } else {
  8. alert("Request was unsuccessful: " + xhr.status);
  9. }
  10. }
  11. };
  12. xhr.open("post", "postexample.php", true);
  13. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  14. let form = document.getElementById("user-info");
  15. xhr.send(serialize(form));
  16. }

1.5 XMLHttpRequest Level 2

1.5.1 FormData 类型

对表单数据进行序列化

  1. let data = new FormData();
  2. data.append("name", "Nicholas");

append()方法接收两个参数:键和值,相当于表单字段名称和该字段的值。
有了 FormData 实例,可以像下面这样直接传给 XHR 对象的 send()方法:

  1. let xhr = new XMLHttpRequest();
  2. xhr.onreadystatechange = function() {
  3. if (xhr.readyState == 4) {
  4. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
  5. alert(xhr.responseText);
  6. } else {
  7. alert("Request was unsuccessful: " + xhr.status);
  8. }
  9. }
  10. };
  11. xhr.open("post", "postexample.php", true);
  12. let form = document.getElementById("user-info");
  13. xhr.send(new FormData(form));

1.5.2 超时