异步通信 — AJAX

220 阅读3分钟

一.AJAX

AJAX(async JavaScript and XML),指的是通过 JavaScript 的异步通信,从服务器获取 XML 文档从中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。后来,AJAX 这个词就成为 JavaScript 脚本发起 HTTP 通信的代名词,也就是说,只要用脚本发起通信,就可以叫做 AJAX 通信。W3C 也在2006年发布了它的国际标准。

二.原生AJAX

function getData(){
	//1生成ajax的核心对象XMLHttpRequest
	var obj=new XMLHttpRequest()
	//2 由ajax引擎发送请求给服务器
	//open(请求方法,url,同步或者异步)
	//请求方法  get post  默认的为get 
	//同步 false  异步true
	obj.open("get","test.php",true)
	obj.send()   null。。。设置请求头
	//获取从服务器返回的数据
	//属性  readyState 请求状态值  0-1-2-3-4
	//0 请求还没有初始化  1请求已经建立连接 2请求已经接受,服务器在处理 3已经接受到部分数据 4已经接受到服务器返回的数据
	//事件  onreadystatechange  当readyState的值发生改变就会触发
	//属性 status http的请求状态码 200 成功  404 找不到文件 400错误 客户端的错误  500是服务器的错误
	obj.onreadystatechange=function(){
		if(obj.readyState==4&&obj.status==200){
			// responseText 来存储从服务器返回的数据
		}
	} 
}
  • 请求状态 readyState表示请求的状态,其一共有5种状态。

0 UNSENT (未打开) open()方法还未被调用.

1 OPENED (未发送) open()方法已经被调用.

2 HEADERS_RECEIVED (已获取响应头) send()方法已经被调用, 响应头和响应状态已经返回.

3 LOADING (正在下载响应体) 响应体下载中; responseText中已经获取了部分数据.

4 DONE (请求完成) 整个请求过程已经完毕.

三.Vue中使用axios

// 下载axios npm i axios --save
import axios from "axios";
axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

四.在vue中封装项目ajax

axios 封装了原生的 XHR,让我们发送请求更为简单,但假设在一个成百上千个 vue 文件的项目中,我们每一个 vue 文件都要写 axios.get()或 axios.post() 岂不是很麻烦?后期的维护也不方便,所以我们要对 axios 进行进一步的封装。
1、在src目录中新建util文件夹,然后新建api.js(接口列表)和request.js(axios请求的封装)
2、创建axios的实例,并且设置baseurl和超时事件
3、创建http对象,遍历api的接口,讲所有接口的方法挂载到http对象上
4、给instance添加拦截器
​	请求拦截器
​	在请求之前触发的拦截器
​	//instance.interceptors.request.use(config=>{},err=>{})
​	第一个回调  处理完自己的事情后必须返回config  比如loading提示 权限的验证
​	响应拦截器
​	在拿到数据之后并且赋值之前会触发,可以过滤数据,数据过滤完成后必须返回res
​	//instance.interceptors.response.use(res=>{},()=>{})
5、抛出http对象

五.Axios 拦截 —— 请求拦截和响应拦截

请求拦截就是在你请求的时候会进行触发!只要是你发送一个 axios 请求就会触发!主要用它做我们的loading 加载和数据的权限验证,包括我们所有的数据预加载也可以实现,响应拦截主要是我们在 loading 加载,和做所有数据加载整体的结束后,就需要在数据发给前端的时候进行隐藏和结束,包括我们的请求头的设置,后端数据已经发送过来的时候,我们为了确保请求头的传递就必须看看header 里面是否有你需要的请求,如果有的话,再次进行设置!当然用 axios 拦截也可以配置公用地址,以及对于跨域问题解决,这个就是用 axios 拦截实现的功能。

//响应拦截
   reqest.interceptors.response.use(response=>{
 //返回成功的数据
       return response;
    },error=>{
    //失败时返回报错
        return Promise.reject(error)
    })
    request.get("data.json").then(reponse=>{
        return response;
    //响应成功之前做些什么
        console.log(response)
    },error = >{
        console.log(error)
    })