您的位置:

XMLHttpRequest对象的详解

XMLHttpRequest对象是JavaScript中实现与服务器进行HTTP通信的重要接口,同时也是AJAX技术的核心。XMLHttpRequest对象通过使用HTTP协议在浏览器和服务器之间交换数据,实现异步刷新数据,而不需要刷新整个页面。本文将从多个方面对XMLHttpRequest对象做详细的阐述。

一、XMLHttpRequest对象的创建与基本属性

XMLHttpRequest对象通过创建一个新的XMLHttpRequest实例来使用。创建XMLHttpRequest对象的方法有两种:使用构造函数XMLHttpRequest()和使用ActiveXObject兼容IE浏览器。创建一个XMLHttpRequest对象的示例代码如下:

var xmlhttp;
if (window.XMLHttpRequest) {
  // 兼容 IE7+, Firefox, Chrome, Opera, Safari 浏览器
  xmlhttp = new XMLHttpRequest();
} else {
  // 兼容 IE6, IE5 浏览器
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
使用XMLHttpRequest对象的基本属性如下:
  • onreadystatechange:当readyState属性改变时触发的事件
  • readyState:请求的状态。状态有0(初始化XMLHttpRequest对象)、1(XMLHttpRequest对象正常打开)、2(已发送一个请求,但未接收到响应)、3(已接收到部分响应数据,仍在等待剩余的响应数据)、4(已完成响应的所有操作)
  • status:响应的HTTP状态码
  • statusText:HTTP状态的文本描述
  • responseText / responseXML:响应内容的文本/ XML对象

二、XMLHttpRequest对象发送请求及响应处理

创建XMLHttpRequest对象实例并设置请求的url、请求方式和请求的传递参数后,我们需要发送请求并处理服务器响应。常见的请求方式有GET和POST方法,其中GET方式的请求参数附在请求url后面,而POST则是放在请求体中。XMLHttpRequest对象的发送请求和处理响应的示例代码如下:

xmlhttp.open("GET", "url", true);
// 判断状态并处理响应
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    // 处理响应内容
    console.log(this.responseText);
  }
};
xmlhttp.send();

三、XMLHttpRequest对象的进度事件

XMLHttpRequest对象除了可以发送请求和接收服务器响应外,还可以监听请求的进度事件,可以用来获取当前请求的状态、上传和下载的进度百分比。XMLHttpRequest对象的进度事件包含5种类型:loadstart、progress、abort、error和load,分别表示请求开始、数据正在上传或下载、请求被取消、请求失败和请求已完成。XMLHttpRequest对象的进度事件示例代码如下:

// 请求开始
xmlhttp.onloadstart = function(e) {
  console.log('loadstart', e);
};

// 接收服务器响应数据
xmlhttp.onprogress = function(e) {
  if (e.lengthComputable) {
    console.log('progress:' + Math.round(e.loaded / e.total * 100) + '%');
  } else {
    console.log('progress:' + e.loaded);
  }
};

// 请求被取消
xmlhttp.onabort = function(e) {
  console.log('abort', e);
};

// 请求失败
xmlhttp.onerror = function(e) {
  console.log('error', e);
};

// 请求完成
xmlhttp.onload = function(e) {
  console.log('load', e);
};

四、XMLHttpRequest对象的跨域请求

XMLHttpRequest对象的跨域请求是指JavaScript代码在访问不同域名的服务器资源时,由于浏览器的同源策略限制,默认情况下只能获取同一域名下的数据。为了解决这个问题,我们需要使用XMLHttpRequest对象的跨域请求功能。常用的跨域请求方式有代理服务器、JSONP和CORS。其中CORS是现代浏览器支持的一种跨域请求方式。XMLHttpRequest对象的跨域请求示例代码如下:

var xmlhttp = new XMLHttpRequest();
url = 'http://example.com/sample.json';
xmlhttp.open('GET', url, true);
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    console.log(this.responseText);
  }
};
xmlhttp.send();

五、XMLHttpRequest对象的安全考虑

XMLHttpRequest对象在使用时需要注意安全性问题。其中XMLHttpRequest对象不能跨域请求cookies,否则会被拒绝。我们可以使用XMLHttpRequest对象的withCredentials属性来支持跨域请求cookies。XMLHttpRequest对象在通过GET方式发送请求时,请求的url中不能包含敏感信息,否则会导致浏览器将该信息暴露出去。同时,XMLHttpRequest对象可以通过设置请求头中的Content-Type属性来支持上传文件。XMLHttpRequest对象的安全响应示例代码如下:

//信任任何来源
Access-Control-Allow-Origin: *

//请求方式
Access-Control-Allow-Methods: *

//自定义请求头
Access-Control-Allow-Headers: *

//可以携带cookies
Access-Control-Allow-Credentials: true

结语

本文从五个方面对XMLHttpRequest对象进行了详细的阐述,包括XMLHttpRequest对象的创建与基本属性、XMLHttpRequest对象发送请求及响应处理、XMLHttpRequest对象的进度事件、XMLHttpRequest对象的跨域请求和XMLHttpRequest对象的安全考虑。希望通过本篇文章对XMLHttpRequest对象有更为深入的了解,为前端开发的实践提供帮助。