Appearance
XMLHttpRequest
基本请求操作
初始化请求
request.open(method, url, async)- async 控制请求是否同步发送,如果同步发送,浏览器会在请求完成之前阻塞主线程,默认为异步
基础配置
request.timeout设置请求超时- 设置请求超时时间,单位为毫秒
- 对于同步请求无效
setRequestHeader设置请求头- http 规范请求头名不区分大小写
- 默认浏览器会将首字母大写
- 非法的请求头会抛出异常
- 注意有些头不允许设置例如, 详细参考 禁止修改的请求头
Content-LengthCookieHost
responseType设置响应数据类型""(空字符串) - 默认值,等同于 "text""text"- 返回文本字符串"arraybuffer"- 返回 ArrayBuffer 对象"blob"- 返回 Blob 对象"document"- 返回解析为 HTML 或 XML 的文档对象,取决于接收到的数据 MIME 类型"json"- 将响应解析为 JSON,返回 JavaScript 对象- 必须在调用
send()前设置,否则可能不生效 - 如果返回类型不匹配,会出现解析失败返回空, responseType
请求发送
- 采用
request.send(data)发送请求- send 只能调用一次,多次调用会抛出异常
- data 支持如下格式
null- 不发送请求体string- 发送字符串ArrayBuffer- 发送 ArrayBuffer 对象Blob- 发送 Blob 对象Document- 发送 Document 对象FormData- 发送 FormData 对象- 注意:如果请求方法是
GET,则不能设置请求体
- 采用
取消请求
request.abort()- 取消请求
- 注意:如果请求已经完成,调用
abort()不会有任何效果 - 注意:如果请求已经完成,调用
abort()不会触发onreadystatechange事件 - 可以采用 AbortController 来取消请求
建议统一采用 AbortController 来取消请求,这样可以保证请求的取消和状态的统一管理
request.onabort监听请求取消- 注意:如果请求失败,
request.status会返回 0
- 注意:如果请求失败,
响应消费
request.response- 获取响应数据
- 注意:如果请求失败,返回
null
request.responseText- 基于
responseType的值为text或json则返回字符串
- 基于
request.responseXML- 如果服务器返回的是 text/xml 或 application/xml,则可访问返回一个 Document 对象(可用于 DOM 解析)
request.status代表响应的 HTTP 状态, 默认值为 0,出错也返回 0request.statusText代表响应的 HTTP 状态文本request.getAllResponseHeaders()获取所有响应头- 返回一个字符串,包含所有响应头
- 注意:如果请求失败,返回
null - 如果是 CORS 请求,只能获取
Access-Control-Allow-Headers头部中列出的响应头, 非 CORS 请求可以获取所有响应头
核心属性和事件
request.readyState代表请求的当前状态- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 请求处理中
- 4: 请求已完成,且响应已就绪
request.onreadystatechange监听请求状态变化request.readyState变化时触发- 注意:如果请求失败,
request.readyState不会变化
request.onload监听请求完成request.readyState为 4 时触发- 注意:如果请求失败,
request.status不会变化
request.onerror监听请求失败request.readyState为 4 时触发- 注意:如果请求失败,
request.status不会变化 - 注意:如果请求失败,
request.status不会变化
request.ontimeout监听请求超时request.readyState为 4 时触发- 注意:如果请求失败,
request.status不会变化
CORS
- 鉴权信息
withCredentials添加鉴权信息- 注意改配置只针对非同源才有效
- 注意需要确保 Access-Control-Allow-Origin 头部的值包含跨域的 url
- 注意需要确保 Access-Control-Allow-Credentials 头部的值为 true
Access-Control-Allow-Origin是*,但Access-Control-Allow-Credentials是 true- 这种情况下,浏览器会拒绝请求
- 解决方案:将 Access-Control-Allow-Origin 设置为具体的域名,而不是
*
进度监控
下载进度
progress监听下载进度event.loaded/event.total计算上传进度
上传进度
upload.onprogress监听上传进度event.loaded/event.total计算上传进度loadend事件表示上传完成