【Axios实战】


一、什么是axios?

    是一个异步请求技术, 基于promise对ajax的一种封装, 本质上也是对原生XHR(XMLHttpReques)的封装,只不过它是基于Promise的,是Promise的实现版本,符合最新的ES规范.

特点:
    在浏览器端使用axios可以发送ajax请求获取数据. 在浏览器通过XMLHttpRequest发送请求.
    在nodejs环境运行,向远端服务发送http请求.
    支持Promise的相关操作.
    请求响应拦截器: 在请求之前做一些准备工作, 在响应回来之后对结果做一些预处理.
    自动将结果转换为json类型数据, 备axios异步请求的特点: 请求之后页面不会刷新, 响应回来更新的是页面的局部, 多个请求之间互不影响, 并行执行

二、安装axios

npm方式

$ npm install axios

CDN

# unpkg CDN
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
# jsDelivr CDN
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

2.1) axios基本使用
发送无参、有参get + post, 标准格式

<script>
       // axios( { method: 'xx', url: url } )
       // 不带参数的get请求
       // 不写method, 默认是get请求
       axios({
           method: 'get',
           url: 'http://localhost:50000/stu/getAllStu'
       }).then((res)=>{    // then 请求成功之后的回调
           console.log(res.data);
       }).catch((err)=>{  //  catch 请求失败的回调
           console.log(err);
       })

       // 有参get方式, 参数配置化方式
       axios({
           method: 'get',
           url: 'http://localhost:50000/stu/getStuById',
           params: {
               id: '1',
               name: '张三'
           }
       }).then((res)=>{
            console.log(res.data);
       })

      // 无参post请求
      axios({
          method: 'post',
          url: 'http://localhost:50000/stu/postAllStu'
      }).then((res)=>{
            console.log(res.data);
      }).catch((err)=>{
         console.log(err);
      })
       
      // 有参post请求, 使用data, 传递的参数默认是application/json的格式,所以后台需要降axios自动封装的
      // json数据转换为java对象, 使用@RequestBody 接受一个对象参数
      // 如果请求到后端接受的参数是类似于一个字符串的形式, 可以使用params传递
      axios({
          method: 'post',
          url: 'http://localhost:50000/stu/postArgsStu',
          data: {
            user: user
          }
      }).then((res)=>{
        console.log(res.data);
      }) 
    </script>

2.2) axios发送并发请求
axios.all() 发起并发请求,参数是一个请求数组

  axios.all([
            axios({
                method: 'get',
                url: 'http://localhost:50000/stu/getAllStu'
            }),
            axios({
                method: 'get',
                url: 'http://localhost:50000/stu/getStuById',
                params: {
                    id: '1'
                }
            })
        ]).then(res =>{
            console.log(res);
        })

2.3) axios全局配置

<script>
        // 默认请求路径信息
        axios.defaults.baseURL='http://localhost:50000/stu';
        // 默认超时时间 毫秒
        axios.defaults.timeout=5000;  

        axios({
            method: 'get',
            url: '/getAllStu'
        }).then(res=>{
            console.log(res.data);
        })
    </script>

2.4) axios实例
    如上我们导入的axios是默认实例, 当对该实例做全局配置后, 所有通过axios发起的请求都是以上的配置, 当遇到需要不同的请求资源时, 就需要多种配置的axios实例

 <script>
        // 创建一个axios实例, 配置url、超时时间
        // 只有使用该实例,其配置才生效
        let request1 = axios.create({
            baseURL: 'http://localhost:50000/stu',
            timeout: 5000
        });
        // 可以创建多个不同配置的axios实例
        let request2 = axios.create({
            baseURL: 'http://localhost:40000/stu',
            timeout: 500
        });

        request1({
            method: 'get',
            url: 'getAllStu'
        }).then(res=>{
            console.log(res.data);
        })
    </script>

2.5) axios拦截器
    axios提供了两种拦截器, 请求拦截器 和 响应拦截器
     请求拦截器: 在请求发送前进行的操作, 比如添加统一cookie、请求体加验证、设置请求头等, 相当于对每个接口里相同操作的封装
    响应拦截器: 也是如此功能, 只是在得到响应之后, 对响应体的一些处理. 通常是数据统一处理, 也常用来判断登陆失效等
请求拦截器: axios.interceptors.request.use()

    <script> 
        axios.interceptors.request.use(config=>{
            console.log('进入请求拦截器');
            return config; // 拦截后请求放行
            console.log('===============================');
        }, err=>{
            console.log("进入请求失败拦截器");
            console.log(err);
        });


        axios({
            method: 'get',
            url:'http://localhost:50000/stu/getAllStu'
        }).then(res=>{
            console.log(res.data);
        })
    </script>

响应拦截器: axios.interceptors.response.use()

 axios.interceptors.response.use(config=>{
            console.log('进入响应拦截器');
            console.log(config.data);  // config.data可以获取响应的数据
            return config; // 拦截后请求放行
            console.log('===============================');
        }, err=>{
            console.log("进入响应失败拦截器");
            console.log(err);
        });


        axios({
            method: 'get',
            url:'http://localhost:50000/stu/getAllStu'
        }).then(res=>{
            console.log(res.data);
        })

三、axios在Vue中封装

3.1) 在vue create demo 脚手架生成项目后, 在main.js中导入axios, 并测试是否可用

import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

axios({
  method:'get',
  url: 'http://localhost:50000/stu/getAllStu'
}).then(res=>{
  console.log(res);
})

测试成功后, 在src下新建request.js, 封装axios , config.js封装ip
config.js

export const serverIp = 'localhost'

封装request.js

import axios from 'axios'
import ElementUI  from 'element-ui';
import router from '@/router';
import {serverIp} from './config'

const request = axios.create({
    // baseURL: 'http://localhost:10000',
    baseURL: `http://${serverIp}:10000`,
    timeout: 5000
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    let user = localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : null
    if (user != null){
        config.headers['token'] = user.token;  // 设置请求头
    }
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        // 当权限验证不通过, 给出提示
        if (res.code === '10003'){
            ElementUI.Message.error({
                message: res.msg,
                type: 'error'
            })
        }
        return res;
    },
    error => {
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)

export default request

在main.js中导入

import request from './utils/request';

其他Vue组建使用this.request.get/post方式使用, 如下案例

methods: {
    load(){
      this.request.get("/user/findUserPageCondition", {
        params: {
          pageNum: this.pageNum,
          pageSize: this.pageSize,
          userName: this.searchusername,
          nickname: this.searchnickname
        }
      }).then(res => {
        console.log(res)
      this.tableData = res.data.records
      this.total = res.data.total
      this.pageNum = res.data.current
      this.pageSize = res.data.size
      })
    },
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值