AJAX: (async javascript and xml)
xml 可扩展的标记语言。
- 早期,客户端和服务器端的数据通信,但是基于XML的数据格式完成通信,当代,俩端之间的数据通信,都是基于强大的JSON等数据格式完成。
- async javascirpt 不是指发送请求是异步的,而是指“浏览器的异步(局部)刷新"【浏览器的全局刷新(服务器端渲染)】
ajax原理: XMLHttpRequest[IE低版本浏览器中ActiveObject]
let xhr = new XMLHttpRequest;
有7个公用的方法:
getAllResponseHeaders: 获取所有的响应头信息
getResponseHeader: 根据传递的参数获取响应头信息
open
abort: 中断一个http请求
setRequestHeader: 设置请求头,必须放在open方法后面,传递的参数不能有中文或者特殊符号 用encodeURLComponent 编译
send
overrideMimeType :覆盖MIMEtype
setTrustToken
做一些基础配置
-
【method】: 请求方法
-
GET系列: GET/DELTE/HEAD/OPTIONS
HEAD 只用于获取服务器的响应头信息,不需要获取响应主体信息。
OPTIONS 试探请求,在CORS跨域中,每发送真实的请求之前,总会发送一个options请求试探请求,主要是验证俩端是否能够跨域通信。
- POST系列:POST/PUT/PATCH
PUT 用于向服务存放文件或者存放大批量数据。
GET和POST的区别?
项目中,GET一般是从服务器获取信息的【给服务器的少,获取的多】,POST一般是给服务器推送信息的【给服务器的多,获取的少】
区别都是约定的规范,不是官方规范
GET系列请求,传递给服务器的信息是基于URL问号传参完成的,而POST是基于请求主体完成的【当然也可以设置请求头,携带部分信息】。
GET: xhr.open('GET', 'http:xxxx/xx?lx=1')
POST: xhr.open('post', 'http:xxx/xx') xhr.send("lx=1");
-
浏览器对于URL地址的长度是有限制的【ie 大概为2KB】,所以GET传递给服务器的信息不能多,但是POST基于请求主体传递信息,理论上是没有长度限制的,但是实际中为了速度,我们需要手动限制。
-
GET系列的请求容易造成不可控制的缓存;【如果俩次请求的地址、参数等信息一致,则有可能第二次请求获取的还是第一次请求的结果】,而post则不会。解决办法:让每一次GET请求的地址,保持唯一性 请求参数加一个随机数
3)GET相对POST来讲不安全;类似于url劫持等低端手段,都可以把传递的信息进行肆意的获取和修改。
-
【url】: 请求链接
-
【async】: 是否启用异步编程,默认是true,一般都采用异步编程,以防止同步下,当数据请求时,无法做其他事情【避免阻碍】
-
【username】一般不需要传
-
【userpass】一般不需要传
xhr.open()
监听请求的状态和阶段,获取服务器返回的信息
-
readyState: ajax请求状态
-
0: UNSENT 最开始
-
1:OPENED 已经开始执行open方法
-
2:HEADERS_RECEIVED 服务器已经返回了响应头
-
3: LOADING 响应主体正在处理和返回
-
4:DONE 响应主体已经获取,证明AJAX请求已经成功
-
status 服务器返回的响应状态码
-
200 :OK 成功
xhr.onreadystatechange = function() {
}
// 设置请求超时的时间
xhr.timeout = 100;
// 在CORS跨域请求中是否允许携带资源凭证(例如:cookie),默认是false
xhr.withCredentials = true;
//监听上传进度:做进度条
xhr.upload.opprogress = function() {}
发送数据请求
-
send中存放的是基于请求主体传送给服务器的信息
-
数据格式:(设置请求头中的Content-type)
-
form-data 表单提交/文件上传(选取的文件) MIME-->mutipart/form-data
-
x-www-form-urlcoded xxx=xxx&xxx=xx MIME---->application/x-www-form-urlcoded
xhr.send(null)
-
raw Text/JSON/XML.. 文本字符串 MIME: text/plain application/json application/xml...
-
binary 二进制/字节流 MIME --->根据选取的文件不同,有不同的类型 image/jpeg application/vnd
openxmlformats --->officedocument.spreadsheetml.sheet
- GraphQL