什么是 AJAX
async javascript and xml:异步的 JS 和 XML
- 此处的异步指的是:局部刷新(对应的是全局刷新)
- XML:可扩展的标记语言,用自己自定义的标签来存储数据的(在很早以前,我们基于 AJAX 和服务器进行交互的数据格式一般都已 XML 格式为主,因为它能清晰展示出对应的数据和结构层级;但是到后面,流行了一种新的数据格式 JSON,它不仅比 XML 更清晰展示数据的结构,而且同样的数据存储,JSON 更加轻量,也方便解析和相关的操作,所以现在前后端的数据交互都已 JSON 格式为主)
AJAX的基础操作
1.创建AJAX实例
let xhr=new XMLHttpRequest; //=>IE低版本浏览器中用的是 new ActiveXObject() 高程三中JS惰性编程思想,关于XHR的兼容处理
2.打开URL(配置发送请求的信息)
//METHOD:HTTP请求方式
//URL:请求地址(API接口地址)
//ASYNC:设置同步或者异步,默认是TRUE异步,FALSE同步
//USER-NAME:传递给服务器的用户名
//USER-PASS:传递给服务器的密码
xhr.open(‘GET’,’./json/xxx.json’,true);
3.监听AJAX状态,在状态为X的时候,获取服务器响应的内容
//AJAX状态码:0 1 2 3 4
xhr.onreadystatechange=function(){
if(xhr.readyState===4 && /^(2|3)\d{2}$/.test(xhr.status)){
let result = xhr.responseText;
}
}
4.发送请求
//SEND中放的是请求主体的内容
xhr.send(null);
=>AJAX任务(发送一个请求给服务器,从服务器获取到对应的内容)从SEND后开始,到XHR.READYSTATE===4的时候算任务结束
AJAX的状态码
xhr.readyState 获取状态码
- UNSEND 0 : 未发送(创建一个XHR,初始状态是0)
- OPENED 1 :已经打开(执行了xhr.open)
- HEADERS_RECEIVED 2 : 响应头信息已经返回给客户端(发送请求后,服务器会依次返回响应头和响应主体的信息)
- LOADING 3 : 等待服务器返回响应内容
- DONE 4 : 响应主体信息已经返回给客户端
HTTP的请求方式
- GET系列请求
- GET
- DELETE 一般应用于告诉服务器,从服务器上删除点东西
- HEAD 只想获取响应头内容,告诉服务器响应主体内容不要了
- OPTIONS 试探性请求,发个请求给服务器,看看服务器能不能接收到,能不能返回
- POST系列请求
- POST
- PUT 和DELETE对应,一般是想让服务器把我传递的信息存储到服务器上(一般应用于文件和大型数据内容)
=>真实项目中用对应的请求方式,会使请求变的更加明确(语义化),不遵循这些方式也可以,最起码浏览器在语法上是允许的;但是这些是开发者们相互间约定俗成的规范;
GET系列一般用于从服务器获取信息,POST系列一般用于给服务器推送信息,但是不论GET和POST都可以把信息传递给服务器,也能从服务器获取到结果,只不过是谁多谁少的问题
- GET:给的少,拿的多
- POST:给的多,拿的少
客户端怎么把信息传递给服务器?
- 问号传参 xhr.open(‘GET’,’/getdata?xxx=xxx&xxx=xxx’)
- 设置请求头 xhr.setRequestHeader([key],[value])
- 设置请求主体 xhr.send(请求主体信息)
服务器怎么把信息返回给客户端?
- 通过响应头
- 通过响应主体(大部分信息都是基于响应主体返回的)
GET系列和POST系列的本质区别:
GET系列传递给服务器信息的方式一般采用:问号传参
POST系列传递给服务器信息的方式一般采用:设置请求主体
- GET传递给服务器的内容比POST少,因为URL有最长大小限制(IE浏览器一般限制2KB,谷歌浏览器一般限制4~8KB,超过长度的部分自动被浏览器截取了)
xhr.open(‘GET’,’/list?name=zhufeng&year=10&xxx=xxx…’)
xhr.send(’…’) 请求主体中传递的内容理论上没有大小限制,但是真实项目中,为了保证传输的速度,我们会自己限制一些
- GET会产生缓存(缓存不是自己可控制的):因为请求的地址(尤其是问号传递的信息一样),浏览器有时候会认为你要和上次请求的数据一样,拿的是上一次信息;这种缓存我们不期望有,我们期望的缓存是自己可控制的;所以真实项目中,如果一个地址,GET请求多次,我们要去除这个缓存;
//=>解决办法设置随机数
xhr.open(‘GET’,’/list?name=zhufeng&_=’+Math.random());
xhr.open(‘GET’,’/list?name=zhufeng&_=’+Math.random());
- GET相比较POST来说不安全:GET是基于问号传参传递给服务器内容,有一种技术叫做URL劫持,这样别人可以获取或者篡改传递的信息;而POST基于请求主体传递信息,不容易被劫持;
$.ajax() 基于原生JS的AJAX四步操作进行封装
* $.ajax([URL],[OPTIONS])
* $.ajax([OPTIONS]) URL在配置项中(推荐)
* $.get/post/getJSON/getScript()
* …
**配置项信息**
* ul:请求的API接口地址
* method:HTTP请求方式,默认GET
* data:传递给服务器的信息,默认null(可以是字符串,可以是对象,而且如果GET系列请求,JQ会自动把信息拼接到URL的末尾,基于问号传参传递给服务器;如果是POST请求,JQ会基于请求主体,把信息传递给服务器)
* dataType:预设服务器返回的结果格式(服务器返回的一般都是JSON格式的字符串,如果我们设置了DATA-TYPE,JQ会根据设置的类型,把服务器返回的结果处理为对应的格式),支持的内容text / json / xml / html / script / jsonp(跨域) =>不影响服务器返回的结果,只是把服务器返回的结果进行二次处理
* async:是否为异步操作,默认是TRUE,代表异步操作
* cache:缓存处理,只对GET系列请求有作用,默认是TRUE不处理缓存,当我们设置FALSE后,JQ帮我们在URL的末尾设置一个随机数
* contentType:设置传递给服务器内容的格式类型 默认是"application/x-www-form-urlencoded"
* 客户端传递给服务器信息的格式(类型一般都是字符串),常用的:
* form-data表单数据:JSON格式 '{"name":"xxx","lx":1}'
* x-www-form-urlencoded:name=xxx&lx=1
* raw:纯文本格式
* headers:设置请求头信息,他是一个对象
* timeout:设置超时的时间
* success:回调函数,当数据请求成功执行,方法中的参数就是从服务器获取的结果
* error:回调函数,数据请求失败执行,方法中的参数是错误信息
$.ajax({
url: 'http://yapi.demo.qunar.com/mock/95100/project/list',
method: 'POST',
data: {
name: 'zhufeng',
lx: 'teacher'
},
dataType: 'json',
async: true,
cache: false,
headers: {},
success: (result, status, xhr) => {
//=>xhr:是JQ帮我们处理过的AJAX实例
console.log(result, status, xhr);
}
});