基于原生JS实现AJAX

//=>创建一个AJAX对象
let xhr=new XMLHttpRequest();//=>不兼容IE6及更低版本浏览器(IE6:ActiveXObject)

//=>打开请求地址(可以理解为一些基础配置,但是并没有发送请求呢)
xhr.open([method],[url],[async],[user name],[user password]);

//=>监听AJAX状态改变,获取响应信息(获取响应头信息、获取响应主体信息)
xhr.onreadystatechange=()=>{
    if(xhr.readyState===4 && xhr.status===200){
        let result=xhr.responseText;//=>获取响应主体中的内容
    }
};

//=>发送AJAX请求(括号中传递的内容就是请求主体的内容)
xhr.send(null);


分析第二步中的细节点

xhr.open([method],[url],[async],[user name],[user password])

[ AJAX请求方式 ] 

1、GET系列的请求(获取)

get

delete:从服务器上删除某些资源文件

head:只想获取服务器返回的响应头信息(响应主体内容不需要获取)

2、POST系列请求(推送)

post

put:向服务器中增加指定的资源文件

不管哪一种请求方式,客户端都可以把信息传递给服务器,服务器也可以把信息返回给客户端,只是GET系列一般以获取为主(给的少,拿回来的多),而POST系列一般以推送为主(给的多,拿回来的少) 

1)我们想获取一些动态展示的信息,一般使用GET请求,因为只需要向服务器端发送请求,告诉服务器端我们想要什么,服务器端就会把需要的数据返回 

2)在实现注册功能的时候,我们需要把客户输入的信息发送给服务器进行存储,服务器一般返回成功还是失败等状态,此时我们一般都是基于POST请求完成 


GET系列请求和POST系列请求,在项目实战中存在很多的区别 

1、GET请求传递给服务器的内容一般没有POST请求传递给服务器的内容多 

原因:GET请求传递给服务器内容一般都是基于url地址问号传递参数来实现的,而POST请求一般都是基于设置请求主体来实现的。 

各浏览器都有自己的关于URL最大长度的限制(谷歌:8KB、火狐:7KB、IE:2KB…)超过限制长度的部分,浏览器会自动截取掉,导致传递给服务器的数据缺失。 

理论上POST请求通过请求主体传递是没有大小限制的,真实项目中为了保证传输的速率,我们也会限制大小(例如:上传的资料或者图片我们会做大小的限制)

2、GET请求很容易出现缓存(这个缓存不可控:一般我们都不需要),而POST不会出现缓存(除非自己做特殊处理); 

原因:GET是通过URL问号传参传递给服务器信息,而POST是设置请求主体; 

设置请求主体不会出现缓存,但是URL传递参数就会了。

//=>每个一分钟从新请求服务器端最新的数据,然后展示在页面中(页面中某些数据实时刷新)
setTimeout(()=>{
    $.ajax({
        url:'getList?lx=news',
        ...
        success:result=>{
            //=>第一次请求数据回来,间隔一分钟后,浏览器又发送一次请求,但是新发送的请求,不管是地址还是传递的参数都和
            第一次一样,浏览器很有可能会把上一次数据获取,而不是获取最新的数据
        }
    });
},60000);

//=>解决方案:每一次重新请求的时候,在URL的末尾追加一个随机数,保证每一次请求的地址不完全一致,就可以避免是从缓存中读取的数据
setTimeout(()=>{
    $.ajax({
        url:'getList?lx=news&_='+Math.random(),
        ...
        success:result=>{}
    });
},60000);

3、GET请求没有POST请求安全(POST也并不是十分安全,只是相对安全) 

原因:还是因为GET是URL传参给服务器 

有一种比较简单的黑客技术:URL劫持,也就是可以把客户端传递给服务器的数据劫持掉,导致信息泄露

URL:请求数据的地址(API地址),真实项目中,后台开发工程师会编写一个API文档,在API文档中汇总了获取哪些数据需要使用哪些地址,
我们按照文档操作即可
     
ASYNC:异步(SYNC同步),设置当前AJAX请求是异步的还是同步的,不写默认是异步(TRUE),如果设置为FALSE,
则代表当前请求是同步的

用户名和密码:这两个参数一般不用,如果你请求的URL地址所在的服务器设定了访问权限,则需要我们提供可通行的用户名和密码才可以
(一般服务器都是可以允许匿名访问的)


第三部分细节研究

//=>监听AJAX状态改变,获取响应信息(获取响应头信息、获取响应主体信息)
xhr.onreadystatechange=()=>{
    if(xhr.readyState===4 && xhr.status===200){
        let result=xhr.responseText;//=>获取响应主体中的内容
    }
};
AJAX状态码:描述当前AJAX操作的状态的 
xhr.readyState

0:UNSENT 未发送,只要创建一个AJAX对象,默认值就是零 
1:OPENED 我们已经执行了xhr.open这个操作 
2:HEADERS_RECEIVED 当前AJAX的请求已经发送,并且已经接收到服务器端返回的响应头信息了 
3:LOADING 响应主体内容正在返回的路上 
4:DONE 响应主体内容已经返回到客户端
HTTP网络状态码:记录了当前服务器返回信息的状态 xhr.status 
200:成功,一个完整的HTTP事务完成(以2开头的状态码一般都是成功)

以3开头一般也是成功,只不过服务器端做了很多特殊的处理 
301:Moved Permanently 永久转移(永久重定向)一般应用于域名迁移 
302:Move temporarily 临时转移(临时重定向,新的HTTP版本中任务307是临时重定向)一般用于服务器的负载均衡:
    当前服务器处理不了,我把当前请求临时交给其他的服务器处理(一般图片请求经常出现302,很多公司都有单独的图片服务器) 
304:Not Modified 从浏览器缓存中获取数据 把一些不经常更新的文件或者内容缓存到浏览器中,下一次从缓存中获取,
    减轻服务器压力,也提高页面加载速度

以4开头的,一般都是失败,而且客户端的问题偏大 
400:请求参数错误 
401:无权限访问 
404:访问地址不存在

以5开头的,一般都是失败,而且服务器的问题偏大 
500:Internal Server Error 未知的服务器错误 
503:Service Unavailable 服务器超负载 
…