021 axios详解

133 阅读4分钟

axios详解

一、axios的特性

axios是一个给予Promise,用于浏览器和node.js的HTTP客户端,简单的理解就是 Ajax的封装。

特性:

  • 从浏览器中创建 XMLHttpRequests
  • 从node.js创建http请求
  • 支持Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换JSON数据

二、axios的安装

  1. 利用npm安装

    npm install axios
    
  2. 利用cdn

    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    
    

三、axios发送get、post请求

  1. get请求
//get请求方式一:
axios({
  // 默认请求方式为get
  method: 'get',
  url: 'http://api',
  // 传递参数
  params: {
    key: value
  },
  // 设置请求头信息
  headers: {
    key: value
  }
responseType: 'json'
}).then((response) => {
  // 请求成功
  let res = response.data;
  console.log(res);
}).catch((error) => {
  // 请求失败,
  console.log(error);
});
//get请求方式二:
axios.get("http://api", {
	// 传递参数
	params: {
		key: value
	},
    // 设置请求头信息,可以传递空值
	headers: {
		key: value
	}
}).then((response) => {
	// 请求成功
	let res = response.data;
	console.log(res);
}).catch(error => {
	// 请求失败,
	console.log(error);
});
  1. post请求
//post请求方式一:
// 注:post请求方法有的要求参数格式为formdata格式,此时需要借助 Qs.stringify()方法将对象转换为字符串
let obj = qs.stringify({
	key: value
});
axios({
	method: 'post',
	url: 'api',
	// 传递参数
	data: obj,
	// 设置请求头信息
	headers: {
		key: value
	},
	responseType: 'json'
}).then((response )=> {
	// 请求成功
	let res = response.data;
	console.log(res);
}).catch(error => {
	// 请求失败,
	console.log(error);
});

//post请求方式二:
let data = {
	key: value
},
headers = {
	USERID: "",
	TOKEN: ""
};
// 若无headers信息时,可传空对象占用参数位置
axios.post("api", qs.stringify(data), {
	headers
}
}).then((response) => {
	// 请求成功
	let res = response.data;
	console.log(res);
}).catch((error) => {
	// 请求失败,
	console.log(error);
});

注意:

  • post 请求的时候参数通过data进行传递。
  • get请求的时候参数通过params进行传递。

四、axios发送并发请求

作用:解决并发请求

主要用到两个函数:

axios.all([])

axios.spread()

axios.all()axios.spread()两个辅助函数用于处理同时发送多个请求,可以实现在多个请求都完成后再执行一些逻辑。注意:该方法是axios的静态方法,不是axios实例的方法!

//方法一:请求成功时响应的是一个数组
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    axios.all([
        axios.get('http://localhost:8888/info'),
        axios.get('http://localhost:8888/infos') 
    ]).then((res) => {
        console.log(res[0]);  //第一个axios请求得到的
        console.log(res[1]);  //第二个axios请求得到的
    }).catch((err) => {
        console.log(err);
    })
</script>

//方法二:采用axios提供的spread函数处理响应数组结果
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    axios.all([
        axios.get('http://localhost:8888/info'),
        axios.get('http://localhost:8888/infos')
    ]).then(axios.spread((res1,res2) =>{
        console.log(res1); //第一个axios请求得到的
        console.log(res2); //第二个axios请求得到的
    })).catch((err) => {
        console.log(err);
    })
</script>

//在methods中定义请求方法,并return出去,不要写请求回调then()
methods:{
    getAllTask:function(){
     console.log('调用第一个接口')
     return this.$axios({
              url:'http://192.168.*.**:***/api/getTask/getAllData',
              method:'GET',
              params:{
                offset:1,
                pageSize:10
              }
            })
    },
    getAllCity:function(){
     console.log('调用第二个接口')
     return this.$axios({
                url:'http://192.168.*.**:***/city/getCities',
                method:'GET',
              })
    }
  },
//在mounted周期同时发送两个请求,并在请求都结束后,输出结果
 mounted:function(){
    var _this = this;  //注意!一定要重新定义一下this指向
    this.$axios.all([_this.getAllTask(),_this.getAllCity()])
    .then(me.$axios.spread(function(res1, res2){
        console.log('所有请求完成')
        console.log('请求1结果',res1)
        console.log('请求2结果',res2)
    }))
  }

总结:两个请求执行完成后,才执行axios.spread()中的函数,且axios.spread()回调函数的返回值中的请求结果的顺序和请求的顺序一致。

五、axios的全局配置

  1. 在main.js文件中配置如下:

    • 全局配置axios的请求根路径
    • 把axios挂载到vue.prototype上,工每个.vue组件的实例直接使用
    // 全局配置 axios 的请求根路径
    //axios.defaults.baseURL固定写法
    axios.defaults.baseURL = 'http://www.liulongbin.top:3006'
     
     
    // 把 axios 挂载到 Vue.prototype 上,供每个 .vue 组件的实例直接使用
    //$http可自己命名(建议使用$http)
    Vue.prototype.$http = axios
    
  2. 在需要发起axios请求的组件中使用

<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <button @click="getInfo">发起 GET 请求</button>
    <button @click="btnGetBooks">获取图书列表的数据</button>
  </div>
</template>
 
<script>
export default {
  methods: {
    async getInfo() {
      	const {  data: res } = await this.$http.get('/api/get')
        console.log(res)
    },
    // 点击按钮,获取图书列表的数据
    async btnGetBooks() {
      	const { data: res } = await this.$http.get('/api/getbooks')
      	console.log(res)
    }
  }
}
</script>

六、axios创建实例

项目中网络请求可能不止一个,可以创建多个axios实例进行不同的配置。

<script>
    //创建一个axios的实例
    let instance=axios.create({
        baseURL:"http://localhost:8888/",
        timeout:4000
    })
    //实例的使用
    instance({
        url: "info"
    }).then(res=>{
        console.log(res);
    })
</script>

七、axios的拦截器

axios提供了两种拦截器:

  1. 请求拦截器(成功、失败)
  2. 响应拦截器(成功、失败)

拦截器的作用:

  1. 在网络请求时发起请求
  2. 请求响应时对操作进行相应的处理

拦截器的使用案例:

  1. 请求拦截器成功时,可以添加网页加载的动画等
  2. 响应拦截器成功时,可以进行数据的相应处理
//定义了两个请求拦截器,两个响应拦截器,为了看运行流程
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
       //axios的请求拦截器,在axios进行网络请求之前触发
       axios.interceptors.request.use(
           config => {
               //在发送请求之前做些什么
               console.log("请求拦截器方向成功1");
               return config;   //请求拦截成功时必须返回config
           },
           error => {
               //对请求错误做些什么
               console.log("请求拦截器方向失败1");
               return Promise.reject(error);
           }
       )
       axios.interceptors.request.use(
           config => {
               console.log("请求拦截器方向成功2");  
               return config;   //请求拦截成功时必须返回config
           },
           error => {
               console.log("请求拦截器方向失败2");
               return Promise.reject(error);
           }
       )
       //axios的响应拦截器,在axios响应数据之前触发
       axios.interceptors.response.use(
           response => {
               //对响应数据做点什么
               console.log("响应拦截器方向成功1");
               return response;  //响应拦截器成功时必须返回response
           },
           error => {
               //对错误数据做点什么
               console.log("响应拦截器方向失败1");
               return Promise.reject(error);
           }
       )
       axios.interceptors.response.use(
           response => {
               console.log("响应拦截器方向成功2");
               return response;  //响应拦截器成功时必须返回response
           },
           error => {
               console.log("响应拦截器方向失败2");
               return Promise.reject(error);
           }
       )

        //axios发送get请求
        axios.get('http://localhost:8888/info').then(res=>{
            console.log(res);
        }).catch(err=>{
            console.log(err);
        })
</script>