• 如何封装axios请求。统一基地址、加载遮罩层、响应参数优化


    gitee地址:https://gitee.com/mengxianchen/axios-request-tool 

    线上体验地址: http://121.43.41.227:82/   浏览器网络设置成3G 体验效果最佳

    一. 创建一个空的vue2项目

     一顿操作后

    1. vue create excel_demo

    2. cd excel_demo

    3. npm run serve

    效果如下

      

    二. 前期准备

    1. 关闭eslint检查

    vue.config.js加上 

    lintOnSave: false

    2.安装插件 element-ui

    npm i element-ui

    main.js里面加上 

    import ElementUI from 'element-ui';

    import 'element-ui/lib/theme-chalk/index.css';

    Vue.use(ElementUI);

    2. 安装插件axios        

    npm i axios

    三. src/App.vue的内容替换成以下代码

    创建两个按钮分别来演示

    未封装时,如何发送get和post请求

    可以看出重复的地方很多,像基地址一样,使用的axios属性一样,响应的数据格式一样,都是{code,message,data}

    如果项目中请求几百个,后期更新维护会很麻烦

    1. <script>
    2. // 导入axios用来发请求
    3. import axios from "axios";
    4. export default {
    5. name: "App",
    6. components: {},
    7. methods: {
    8. // 发送get请求
    9. getReq(){
    10. axios({
    11. method:'get',
    12. url:'https://www.fastmock.site/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/getUser',
    13. })
    14. .then(getRes => {
    15. console.log(getRes);
    16. this.$message.success(getRes.data.message)
    17. });
    18. },
    19. // 发送post请求
    20. postReq(){
    21. axios({
    22. method:'post',
    23. url:'https://www.fastmock.site/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/updUser',
    24. data:{ p1 :'参数1', p2 :'参数2'}
    25. })
    26. .then(postRes => {
    27. console.log(postRes);
    28. this.$message.success(postRes.data.message)
    29. });
    30. },
    31. },
    32. };
    33. script>
    34. <style>
    35. .box{
    36. margin: 100px 500px;
    37. }
    38. style>

    四. 在src目录下新建 utils/request.js

    封装一个axios实例,导出去供人使用

    该工具实现了

    1. 统一基地址

    2. 每次发送请求出现加载遮罩层,响应数据后关闭遮罩层

    3. 优化响应数据格式,降低复杂度

    1. import axios from "axios"
    2. import { Loading } from 'element-ui';
    3. // 封装自定义axios实例
    4. const serve = axios.create({
    5. // 设置基地址
    6. baseURL:'https://www.fastmock.site',
    7. })
    8. let loadingInstance
    9. // 请求拦截器
    10. serve.interceptors.request.use(function (config) {
    11. // 开启加载弹窗
    12. loadingInstance = Loading.service({ fullscreen: true });
    13. // console.log('开启弹窗',loadingInstance);
    14. return config;
    15. }, function (error) {
    16. return Promise.reject(error);
    17. });
    18. // 响应拦截器
    19. serve.interceptors.response.use(function (response) {
    20. // 关闭加载弹窗
    21. // 如果响应过快需要将浏览器Network里网络设置成3G,才能看到加载效果
    22. loadingInstance.close();
    23. console.log('减少复杂度之前的响应数据',response);
    24. // 优化响应数据格式,减少复杂度
    25. return {
    26. code: response.data.code,
    27. message: response.data.message,
    28. data: response.data.data,
    29. }
    30. }, function (error) {
    31. return Promise.reject(error);
    32. });
    33. export default serve

    五. 在App.vue使用

    导入axios改成导入工具层的request.js

    代码优化为↓

    1. <script>
    2. // 导入axios工具文件用来发请求
    3. import request from "@/utils/request";
    4. export default {
    5. name: "App",
    6. components: {},
    7. // 封装请求工具优化后↓↓↓
    8. methods: {
    9. // 发送get请求
    10. async getReq() {
    11. const res = await request({
    12. url: "/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/getUser",
    13. });
    14. console.log(res);
    15. this.$message.success(res.message);
    16. },
    17. // 发送post请求
    18. async postReq() {
    19. const res = await request({
    20. url: "/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/updUser",
    21. method: "post",
    22. data: { p1: "参数1", p2: "参数2" },
    23. });
    24. console.log(res);
    25. this.$message.success(res.message);
    26. },
    27. },
    28. };
    29. script>
    30. <style>
    31. .box {
    32. margin: 100px 500px;
    33. }
    34. style>

    看到这里 ,一部分长得好看的小伙伴,会想到当前代码可以再分一个 接口层

    六. 再次解耦,请求都放到接口层 创建目录src/api/user/user.js

    src 下创建 api/user.js

    1. import request from '@/utils/request'
    2. export function apiGet(){
    3. return request({
    4. url: '/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/getUser',
    5. method: 'get'
    6. })
    7. }
    8. export function apiPost(data){
    9. return request({
    10. url: '/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/updUser',
    11. method: 'post',
    12. data
    13. })
    14. }

    这里的传参可能不好理解! 为什么参数传了 url和method  能在 utils/request.js 里用?

    utils/request.js 里并没有写接收这两个参数的代码。

    因为 utils/request.js 导出的是一个自定义配置的axios实例,给它传参数等于在给它进行自定义配置。 具体能传哪些参数 参考axios文档: http://www.axios-js.com/zh-cn/docs/#axios-create-config

     

    app.vue代码优化。 script标签覆盖为以下代码

    此时页面效果一样,导入接口的方法后,仅一行代码就能发送请求。

    记得加 async await来修饰

    七. 优化遮罩层 请求时控制是否使用

    原理就是发送个自定义请求头参数,请求拦截器里通过判断该参数来控制

    utils/request.js 中请求拦截器和响应拦截器 的代码优化如下

    1. // 请求拦截器
    2. serve.interceptors.request.use(function (config) {
    3. console.log('请求头',config.headers);
    4. // 请求头中接收参数 是否加载遮罩层弹窗()
    5. const isLoading = config.headers.isLoading
    6. // isLoading存在 则开启遮罩层弹窗
    7. isLoading ? loadingInstance = Loading.service({ fullscreen: true }) : null
    8. // console.log('开启弹窗',loadingInstance);
    9. return config;
    10. }, function (error) {
    11. return Promise.reject(error);
    12. });
    13. // 响应拦截器
    14. serve.interceptors.response.use(function (response) {
    15. // 如果响应过快需要将浏览器Network里网络设置成3G,才能看到加载效果
    16. // 关闭遮罩层弹窗(如果有)
    17. loadingInstance && loadingInstance.close();
    18. console.log('减少复杂度之前的响应数据',response);
    19. // 优化响应数据格式,减少复杂度
    20. return {
    21. code: response.data.code,
    22. message: response.data.message,
    23. data: response.data.data,
    24. }
    25. }, function (error) {
    26. return Promise.reject(error);
    27. });

    api/user.js 代码优化如下

    1. import request from '@/utils/request'
    2. export function apiGet(isLoading = false){
    3. return request({
    4. url: '/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/getUser',
    5. method: 'get',
    6. headers:{ isLoading }
    7. })
    8. }
    9. export function apiPost(data, isLoading = false){
    10. return request({
    11. url: '/mock/7a24fbd3721a2bb3ca8b81050909b081/login/api/updUser',
    12. method: 'post',
    13. data,
    14. headers:{ isLoading }
    15. })
    16. }

    App.vue 中 methods里的方法  优化如下

    用法:只需要传 bool值 

     true 或 1 或其他会隐式转化为true的值都可以  都会触发遮罩层 !

    1. methods: {
    2. // 发送get请求
    3. async getReq() {
    4. const res = await apiGet(true);
    5. console.log(res);
    6. this.$message.success(res.message);
    7. },
    8. // 发送post请求
    9. async postReq() {
    10. const res = await apiPost({ p1: "参数1", p2: "参数2" }, true);
    11. console.log(res);
    12. this.$message.success(res.message);
    13. },
    14. },

    完工,各位大佬可以在此基础上优化

  • 相关阅读:
    超参数优化(网格搜索和贝叶斯优化)
    基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能(五)
    同源策略和跨域问题
    大数据平台之数据存储
    Github:ChatTTS从下载到使用
    用C++元编程实现任意函数签名的回调
    ORACLE集群管理-19C RAC重新配置IPV6
    14.ElasticSearch系列之分布式特性及分布式搜索机制(三)
    电子警察联网解决方案,让违法无处遁逃
    05.QString字符串处理及中文乱码问题处理
  • 原文地址:https://blog.csdn.net/qq_18816201/article/details/125730568