XMLHttpRequest
1.1 什么是 XMLHttpRequest
XMLHttpRequest(XHR) 对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 AJAX 编程中被大量使用。XMLHttpRequest 可以用于获取任何类型的数据,不仅仅是 XML,还可以获取 JSON 或者纯文本。它甚至支持 HTTP 以外的协议(包括 file:// 和 FTP),但可能受到出于安全等原因的限制。
1.2 XMLHttpRequest 说明
1.2.1 XMLHttpRequest 相关属性
☞ readyState HTTP 请求的状态,当一个 XMLHttpRequest 初次创建时,这个属性的值从 0 开始,直到接收到完整的 HTTP 响应,这个值增加到 4。5 个状态中每一个都有一个相关联的非正式的名称,readyState 的值不会递减,除非当一个请求在处理过程中的时候调用了 abort() 或 open() 方法。每次这个属性的值增加的时候,都会触发 onreadystatechange 事件句柄。
状态 |
名称 |
描述 |
---|---|---|
0 |
Uninitialized |
初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置 |
1 |
Open |
open() 方法已调用,但是 send() 方法未调用。请求还没有被发送 |
2 |
Sent |
Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应 |
3 |
Receiving |
所有响应头部都已经接收到。响应体开始接收但未完成 |
4 |
Loaded |
HTTP 响应已经完全接收 |
☞ status 由服务器返回的 HTTP 状态代码,如 200 表示成功,而 404 表示 “Not Found” 错误。当 readyState 小于 3 的时候读取这一属性会导致一个异常。
☞ statusText 这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。也就是说,当状态为 200 的时候它是 “OK”,当状态为 404 的时候它是 “Not Found”。和 status 属性一样,当 readyState 小于 3 的时候读取这一属性会导致一个异常。
☞ response 该属性只读表示服务器返回的数据体,可能是任意的数据类型,比如字符串,对象,二进制对象等,具体类型由responseType 属性决定。如果本次请求没有成功或者数据不完整,该属性等于 null
☞ responseText 目前为止为服务器接收到的响应体(不包括头部),或者如果还没有接收到数据的话,就是空字符串。如果 readyState 小于 3,这个属性就是一个空字符串。当 readyState 为 3,这个属性返回目前已经接收的响应部分。如果 readyState 为 4,这个属性保存了完整的响应体。如果响应包含了为响应体指定字符编码的头部,就使用该编码。否则,默认使用 Unicode UTF-8。
☞ responseXML 对请求的响应,解析为 XML 并作为 Document 对象返回。
☞ responseType 表示服务器返回数据的类型,这个属性是可写的,在 open 之后,send 之前,告诉服务器返回指定类型的数据。如果 responseType 设为空字符串,就等同于默认值 text 表示服务器返回文本数据;arraybuffer 表示服务器返回二进制数组;blob 表示返回二进制对象;document 返回一个文档对象;json 返回json对象,浏览器自动对返回数据调用 JSON.parse() 方法
☞ onreadystatechange 每次 readyState 属性改变的时候调用的事件句柄函数。当 readyState 为 3 时,它也可能调用多次。
1.2.2 XMLHttpRequest 相关方法
方法 |
说明 |
---|---|
abort() |
取消当前响应,关闭连接并且结束任何未决的网络活动 |
getAllResponseHeaders() |
把 HTTP 响应头部作为未解析的字符串返回 |
getResponseHeader() |
返回指定的 HTTP 响应头部的值 |
open() |
初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,但是并不发送请求 |
send() |
发送 HTTP 请求,使用传递给 open() 方法的参数,以及传递给该方法的可选请求体 |
setRequestHeader() |
向一个打开但未发送的请求设置或添加一个 HTTP 请求 |
1.2.3 XMLHttpRequest 的使用
☞ 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
☞ 初始化 HTTP 请求参数
xhr.open(method, url, async, username, password)
这个方法初始化请求参数以供 send() 方法稍后使用。它把 readyState 设置为 1,删除之前指定的所有请求头部,以及之前接收的所有响应头部,并且把 responseText、responseXML、status 以及 statusText 参数设置为它们的默认值。当 readyState 为 0 的时候(当 XMLHttpRequest 对象刚创建或者 abort() 方法调用后)以及当 readyState 为 4 时(已经接收响应时),调用这个方法是安全的。当针对任何其他状态调用的时候,open() 方法的行为是为指定的。 除了保存供 send() 方法使用的请求参数,以及重置 XMLHttpRequest 对象以便复用,open() 方法没有其他的行为。要特别注意,当这个方法调用的时候,实现通常不会打开一个到 Web 服务器的网络连接。
参数说明 ① method 参数是用于请求的 HTTP 方法。值包括 GET、POST。 ② url 参数是请求的主体。大多数浏览器实施了一个同源安全策略,并且要求这个 URL 与包含脚本的文本具有相同的主机名和端口。 ③ async 参数指示请求使用应该异步地执行。如果这个参数是 false,请求是同步的,后续对 send() 的调用将阻塞,直到响应完全接收。如果这个参数是 true 或省略,请求是异步的,且通常需要一个 onreadystatechange 事件句柄。 ④ username 和 password 参数是可选的,为 url 所需的授权提供认证资格。如果指定了,它们会覆盖 url 自己指定的任何资格。
☞ 发送一个 HTTP 请求
xhr.send();
这个方法导致一个 HTTP 请求发送。如果之前没有调用 open(),或者更具体地说,如果 readyState 不是 1,send() 抛出一个异常。否则,它发送一个 HTTP 请求,该请求由以下几部分组成: ♞ 之前调用 open() 时指定的 HTTP 方法、URL 以及认证资格(如果有的话)。 ♞ 之前调用 setRequestHeader() 时指定的请求头部(如果有的话)。 ♞ 传递给这个方法的 body 参数。 一旦请求发布了,send() 把 readyState 设置为 2,并触发 onreadystatechange 事件句柄。
☞ 监听函数
xhr.onload = function() {
var responseText = xhr.responseText;
console.log(responseText);
};
XMLHttpRequest 对象可以对以下事件指定监听函数。
XMLHttpRequest.onloadstart
:loadstart 事件(HTTP 请求发出)的监听函数
XMLHttpRequest.onprogress
:progress事件(正在发送和加载数据)的监听函数
XMLHttpRequest.onabort
:abort 事件(请求中止,比如用户调用了abort() 方法)的监听函数
XMLHttpRequest.onerror
:error 事件(请求失败)的监听函数
XMLHttpRequest.onload
:load 事件(请求成功完成)的监听函数
XMLHttpRequest.ontimeout
:timeout 事件(用户指定的时限超过了,请求还未完成)的监听函数
XMLHttpRequest.onloadend
:loadend 事件(请求完成,不管成功或失败)的监听函数
1.3 示例
// 构造表单数据
var formData = new FormData();
formData.append('username', 'johndoe');
formData.append('id', 123456);
// 创建xhr对象
var xhr = new XMLHttpRequest();
// 设置请求头
xhr.setRequestHeader('Content-Type', 'application/json');
// 设置xhr请求的超时时间
xhr.timeout = 3000;
// 设置响应返回的数据格式
xhr.responseType = "text";
// 创建一个 post 请求
xhr.open('POST', '/server');
// 注册相关事件回调处理函数
xhr.onload = function(e) {
if(this.status == 200||this.status == 304){
console.log(this.responseText);
}
};
xhr.ontimeout = function(e) {
console.log("请求超时");
};
// 发送数据
xhr.send(formData);
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一行代码不用写,就可以训练、测试、使用模型,这个star量1.5k的项目帮你做到
- Android画板开发之橡皮擦功能
- Android画板开发之基本画笔功能
- python递归函数求n的阶乘,优缺点及递归次数设置方式
- Python 给下载文件显示进度条和下载时间的实现
- pytorch 中的重要模块化接口nn.Module的使用
- 东京大学版「一生一芯」:自制CPU、C编译器,还成功运行了类Unix系统
- python实现将range()函数生成的数字存储在一个列表中
- Pytorch 使用不同版本的cuda的方法步骤
- CVE-2020-14645 Weblogic远程代码执行漏洞分析
- PaGoDo:一款功能强大的被动式Google Dork
- 微软轻量级系统监控工具sysmon原理与实现完全分析
- 用Windows电脑训练深度学习模型?超详细配置教程来了
- rConfig中的远程代码执行漏洞分析
- CVE-2020-9964:iOS中的信息泄露漏洞分析