vue基础-axios封装/同步请求

📖 本章介绍 Vue 项目中如何使用 Axios 封装 http 请求,请求/响应拦截器部分写的比较简单,后续项目中可以补充。

💦 1、/src/utils/目录下建立一个htttp.js

  1. 导入axios
  2. 设置axios请求参数
  3. 创建axios实例
  4. 请求拦截器
  5. 响应拦截器
  6. 封装get请求导出
  7. 封装post请求导出
// 0、导入axios
import axios from 'axios'

// 1、设置axios请求参数
axios.defaults.timeout = 5000; //请求超时5秒
axios.defaults.baseURL = ''; //请求base url
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //设置post请求是的header信息

// 2、创建axios实例
const service = axios.create({
    timeout: 60000
})

// 3、请求拦截器
service.interceptors.request.use(config => {
    // 每次发送请求之前,此处做校验
    console.log("请求拦截器1调用成功");
    let token = sessionStorage.getItem('token')
    if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
        config.headers = {
            'X-token': token
        }
    }
    return config
}, error => {
    console.log("请求拦截器1调用失败");
    return Promise.reject(error)
})

// 4、响应拦截器
service.interceptors.response.use(response => {
    // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
        console.log("响应拦截器1调用成功");
        if (response.data.code === 511) {
            // 未授权调取授权接口
        } else if (response.data.code === 510) {
            // 未登录跳转登录页
        } else {
            return Promise.resolve(response)
        }
    } else {
        return Promise.reject(response)
    }
}, error => {
    // 我们可以在这里对异常状态作统一处理
    if (error.response.status) {
        // 处理请求失败的情况
        // 对不同返回码对相应处理
        console.log("响应拦截器1调用失败");
        return Promise.reject(error.response)
    }
})

// 5、导出实例
export default service

// 6.1、封装get请求导出
/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function getApi(url, params = {}, headers = {}) {
    return new Promise((resolve, reject) => {
        service.get(url, {
            params: params,
            headers: headers
        })
        .then(response => {
            resolve(response.data);
        })
        .catch(err => {
            reject(err)
        })
    })
}

// 6.2、封装post请求导出
/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function postApi(url, data = {}) {
    return new Promise((resolve, reject) => {
        service.post(url, data)
        .then(response => {
            resolve(response.data);
        }, err => {
            reject(err)
        })
    })
}

💦 2、组件内使用

<template>
  <div>
    <button @click="send">发送get</button>
    <br />
    {{info}}
  </div>
</template>

<script>
import axios from "axios";
import {postApi,getApi} from '@/utils/http.js'

export default {
  data() {
    return {
      info: ""
    };
  },
  methods: {
    send() {
      getApi("/testapi/try/ajax/json_demo.json")
      .then(response => {
        console.log(response);
        console.log(response.sites);
        this.info = response;
      });
    }
  }
};
</script>

在这里插入图片描述

📌 传递参数

export default {
  data() {
    return {
      info: ""
    };
  },
  methods: {
    send() {
      getApi("/testapi/try/ajax/json_demo.json", {
        param1: 'aaaa',
        param2: 'bbbb'
      }, {
        'Content-Type': 'application/x-www-form-urlencoded'
      })
      .then(response => {
        this.info = response;
      });
    }
  }
};

在这里插入图片描述

📅 同步请求
Axios 是一个基于 Promise 的 HTTP 库。而 async/await 是一种建立在 Promise 之上的编写异步或非阻塞代码的新方法。

🎈场景:一个请求需要依次同步请求多个其他请求

queryData('http://localhost:3000/test1')
  .then(function (data) {
     console.log(data);
     return queryData('http://localhost:3000/test2');
  })
  .then(function (data) {
     console.log(data);
     return queryData('http://localhost:3000/test3');
  })
  .then(function (data) {
     console.log(data);
  });

如果要按顺序发送多次请求,还是有些麻烦的,因为我们需要一直去 .then 来得到结果,上述代码还会带来 回调地狱 问题。

📌 所以在 ES7 中有了一种新的语法:async/await,可以更加方便的进行异步操作,先看一下上面的请求如果在 axios 中用这个语法来写是什么效果:

axios.defaults.baseURL = 'http://localhost:3000';
async function queryData() {
    var ret = await axios.get('/test1');
    var ret1 = await axios.get('/test2');
    var ret2 = await axios.get('/test3');
    return [ret, ret1, ret2];
}

console.log(queryData());

在这里插入图片描述

📌 代码看起来更加简洁,就像是同步执行一样,省略了 .then 取到结果的过程。

📚参考文章:
📖axios进行同步请求(async+await)

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值