什么是 AJAX
- async javascript and xml:异步的 JS 和 XML
- 全局刷新「服务器渲染」和局部刷新「AJAX」
- async JavaScript:这里不是指的以后发送 AJAX 请求都采用异步
- 而是代表浏览器的异步「局部」刷新「前后端分离」
- 浏览器的全局刷新「不分离,服务器渲染」
- XML:可扩展的标记语言「自己定义的」
- HTML:超文本标记语言「W3C规定的」
AJAX 的核心步骤
一、创建一个 XMLHTttpRequest 实例对象「IE 低版本浏览器使用的是:ActiveXObject」
let xhr = new XMLHttpRequest;
二、发送请求前的一些配置信息
- method:请求方式「一般推荐使用大写」
-
GET 系列的请求
- GET:项目中,GET 一般用于从服务器获取信息「给服务器的少,从服务器拿的多」
- DELETE:一般用于删除服务器上的某个文件
- HEAD:只获取服务器的响应头信息,不需要获取响应主体信息「状态码返回:204」
- OPTIONS:试探请求
- 在没发送真实的请求之前,总是先发送一个 OPTIONS 试探请求,主要是验证两端是否能够跨域通信
- 如果能跨域通信了,那么在发送真正的请求
-
POST 系列的请求
-
POST: 一般用于给服务器推送信息「给服务器的多,从服务器端获取的少」
-
PUT:用于向服务器上存放文件或者存放大批量数据「富文本编辑器/传文件」
-
PATCH:
-
GET 和 POST 两大系列的区别
- 传递的参数不同
- GET 系列的请求,传递给服务器的信息,除了请求头传递以外,要求基于 URL 问号传参的形式传递给服务器完成的
- POST 是基于请求主体完成的;当然都可以设置请求头,携带部分信息
- GET 传递的信息不如 POST 多
- 因为 URL 有长度限制的「IE 下是有 2KB 的限制」,超过这个长度的信息会被自动截掉,这样导致内容过多,最后服务器收到的信息是不完整的
- POST 理论上是没有限制的,但是传递的东西越多,速度越慢,可能导致浏览器报错,传输超时的错误,所以实际上我们会自己手动做限制
- GET 会产生缓存「浏览器默认产生的,不可控的缓存」
- 两次及以上,请求相同的 API 接口,并且传递的参数也一样,浏览器可能会把第一次请求的信息直接返回,而不是从服务器获取最新的信息
- 清除缓存的方式:在请求 URL 的末尾设置随机数,以此来清除 GET 缓存的副作用
- POST 相对于 GET 来讲更安全一些
-
GET 传递的信息是基于 URL 末尾拼接,这个随便做一些劫持或者修改,都可以直接改了
-
POST 请求也不是绝对的安全,只要涉及安全的信息,都需要手动加密「因为默认所有的信息传输都是明文的」
-
什么时候用 GET / POST
- 敏感或者需要保证安全的一些数据需要使用 POST
- 传递给服务器信息比较多的时候,也需要使用 POST
-
- URL 请求地址
- async 是否采用异步
- 默认为 true,一般都采用异步编程,以防止同步下,当数据请求超时,其余事情无法处理的问题(避免阻塞)
- username/userpass
- 提供用户名和密码,只有提供了之后才能发送请求
三、监听请求的过程:xhr.onreadystatechange = function(){}
- readystate:AJAX 请求状态
- 0:UNSENT「最开始」
- 1:OPENED「已经执行 opend 方法了」
- 2: HEADERS_RECEIVED「服务器已经返回了响应头信息」
- 3:LOADING「响应主体信息正在处理和返回」
- 4:DONE「响应主体信息已经获取,此时证明 AJAX 请求结束了」
- 服务器返回的 HTTP 状态码
-
xhr.status(状态码)
- 常见状态码
- 200:OK「成功」
- 1:通知
- 2:代表成功
- 3: 代理成功「重定向」,需要进行一些处理
- 4:客户端错误
- 5:服务器端错误
- 响应状态码
- 200 OK
- 202 Accepted :服务器已接收请求,但尚未处理
- 204 No Content:服务器成功处理了请求,但不需要返回任何实体内容
- 206 Partial Content:服务器已经成功处理了部分 GET 请求(断点续传 Range/If-Range/Content-Range/Content-Type:”multipart/byteranges”/Content-Length….)
- 301 Moved Permanently:永久转移
- 一般用于服务器搬家或者是域名更换,访问老的域名,直接让其跳转到新的域名上「域名迁移」
- 302 Move Temporarily:临时转移
- 一般用于服务器负载均衡「服务器处理不过来之后,会转移到另一个服务器」「负载均衡」
- 304 Not Modified:协商缓存
- 305 Use Proxy:跨域代理
- 400 Bad Request : 请求参数有误
- 401 Unauthorized:没有权限(Authorization)
- 403:比如:调用第三方接口,不允许使用
- 404 Not Found:找不到文件「地址错误」
- 405 Method Not Allowed:请求方式不被允许
- 408 Request Timeout:请求超时
- 500 Internal Server Error:服务器出现异常,具体不知道哪出现的异常「未知服务器错误」
- 503 Service Unavailable:超载负荷「超出服务器所能承受的最大容量了」
- 505 HTTP Version Not Supported:HTTP 版本不支持
- 常见状态码
-
获取响应主体信息
- xhr.response
- xhr.responseText
- xhr.responseXML
-
服务器返回的响应主体信息的格式
- 字符串「一般是 JSON 字符串」「最常用的」
- XML 格式数据
- 文件流格式数据「buffer/二进制」
-
获取响应头信息
- xhr.getResponseHeader:获取指定的响应头信息
- xhr.getAllResponseHeaders:获取所有的响应头信息
-
设置请求头
- xhr.setRequestHeader()
四、发送数据请求:xhr.send()
- send 中存放的是基于请求主体传递给服务器的信息,如果没有则传递 null
- POST 请求通过请求主体发送信息
- 设置请求头信息&超时时间&携带资源凭证,需要设置在 open 之后 send 之前
- 设置请求头信息中,不允许出现中文
- send 方法,默认把对象格式转换为字符串格式:text/plain
数据格式「设置请求头中的 Content-Type」
- form-data:主要应用于文件的上传或者表单数据提交或者图片
- 'Content-Type', 'multipart/form-data'
- x-www-form-urlencoded:类似于问号传参格式「"lx=1&name=gy"」
- 'Content-Type', 'application/x-www-form-urlencoded'
- Qs.stringify/parse:实现对象和 urlencoded 格式字符串之间的转换
- JSON.stringify/JSON.parse 也可以实现
- binary:进制数据文件,一般用于文件上传
- 图片
- 请求头:image/jpeg
- Excel 格式
- 请求头:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- 图片
- 普通字符串格式
- Content-Type:text/plain
- JavaScript 字符串格式
- Content-Type:application/javascript
- JSON 字符串
- Content-Type:application/json
- XML 格式字符串
- Content-Type:application/xml
AJAX 方法
- abort:中断当前 AJAX 请求,会触发:xhr.onabort() 事件
- getAllResponseHeaders:获取所有的响应头信息『当做字符串获取』
- getResponseHeader:获取指定的响应头信息
- open
- overrideMimeType:指定 content-Type 类型
- send:发送请求
- setRequestHeader:设置响应头信息
汇总XHR的属性和方法及事件
- xhr.response / xhr.responseText / xhr.responseXML
- xhr.status / xhr.statusText
- xhr.timeout
- xhr.withCredentials
- xhr.abort()
- xhr.getAllResponseHeaders()
- xhr.getResponseHeader([key])
- xhr.open()
- xhr.overrideMimeType()
- xhr.send()
- xhr.setRequestHeader()
AJAX 事件监听
- onabort:中断 AJAX 请求,触发
- onerror:请求失败
- onload:加载成功
- onloadend:加载完成
- onloadstart:加载开始
- onprogress:上传文件
- upload:上传文件
- onprogress:监听上传进度「做进度条」
- xhr.upload.onprogress = function() {}:文件传输监听上传进度
- onreadystatechange:监听状态
- ontimeout:超时 设置超时时间,监听是否超时
- readyState:请求状态
- timeout:设置是否超时
- status:HTTP 状态码
- withCredentials:在 CORS 跨域资源请求中,是否允许携带资源凭证「例如:cookie;是否允许携带 cookie」,默认为 false,不允许
- 获取响应主体信息
- response: (...)
- responseText: (...)
- responseType: (...)
- responseURL: (...)
- responseXML: (...)