Vue2.X项目超简单整合Axios并使用

简介: 这篇文章提供了Vue 2.X项目中如何整合Axios的详细步骤,包括配置请求拦截器、响应拦截器、错误处理以及在Vue组件中调用Axios进行数据请求的方法。

记录一下通用的Vue项目超简单整合Axios,复制粘贴代码后npm run serve或npm start,如控制台提示缺少依赖包,npm导入一下即可。

src/api/request.js

import axios from 'axios';
// import Nprogress from 'nprogress'
// import 'nprogress/nprogress.css'
import {
    ElMessage } from 'element-plus'

/**
 * 注意:
 * 由于项目部署到 Nginx 反向代理服务器,Nginx 默认超时时间为 60秒 * 2 (即 proxy_connect_timeout 默认超时时间的 60 秒 + proxy_read_timeout 默认超时时间的 60 秒),
 * 因此需要设置 Nginx 的 proxy_connect_timeout 和 proxy_read_timeout 超时配置,axios 的 timeout 才可起作用。
 * 另外,proxy_connect_timeout 不能超过 75 秒,此配置不是等待后端返回页面的时间,而 proxy_read_timeout 才是声明等待后端返回页面的时间的配置。
 */
const http = axios.create({
   
  baseURL: '/loveProject/api/',
  timeout: 3800 * 1000,
})

const NETWORK_ERROR = '网络错误,请联系开发人员'

/**
 * 请求拦截器
 */
http.interceptors.request.use((req) => {
   
  console.log('请求拦截器 =>', req)
  Nprogress.start()
  return req;
}, (error) => {
   
  Nprogress.done()
  return Promise.reject(error);
});

/**
 * 响应拦截器
 */
http.interceptors.response.use(function (res) {
   
  console.log('响应拦截器 =>', res)
  Nprogress.done()
  const {
   code, data, msg} = res.data
  if (code == 200) {
   
    return data
  } else {
   
    ElMessage.error((msg || NETWORK_ERROR))
    return Promise.reject(msg || NETWORK_ERROR)
  }
});

export default http

src/api/User/index.js

import http from '../request'

export default {
   
  /**
   * 根据userId查询用户
   * @param {*} userId 
   * @returns 
   */ 
  getUserById(userId) {
   
    return http.get(`https://***.com/zhiquan181/api/getUserById?userId=${
     userId}`)
  },

  /**
   * 查询所有用户
   * @returns 
   */ 
  getUsers() {
   
    return http.get(`/getUsers`)
  },

  /**
   * 保存用户信息
   * @param {*} data 
   * @returns 
   */
  saveJobRerunInfo(data) {
   
    return http({
   
      method: "POST",
      url: `https://***.com/zhiquan181/api/saveUserInfo`,
      headers: {
   
        "Content-Type": "application/json"
      },
      data
    })
  }
}

src/api/index.js

import Vue from 'vue'
import userApi from './User/index'
import axios from 'axios'

Vue.prototype.$http = {
   
  ...userApi,
}

Vue.prototype.$axios = axios

src/main.js

import Vue from 'vue'
import App from './App.vue'
import './utils/elementui'
import router from './router'
import store from './store'
import './api/index'
import './assets/less/public.css'
import './utils/moment'
import './assets/theme/index.css'
import moment from 'moment'
Vue.config.productionTip = false
Vue.prototype.$moment = moment;

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

vue.config.js

const CompressionPlugin = require('compression-webpack-plugin')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const vConsolePlugin = require('vconsole-webpack-plugin')

module.exports = {
   
  outputDir: "static",// 定义打包目录,全局可访问
  publicPath: "/zhiquan181",// 定义公共地址,全局可访问
  lintOnSave: true,
  productionSourceMap: false,
  configureWebpack: (config) => {
   
    config.externals = {
   
      'vue': 'Vue',
      'element-ui': 'ELEMENT',
      'vue-router': 'VueRouter',
      'vuex': 'Vuex',
      'axios': 'axios',
      "moment": "moment"
    }

    /**
     * 压缩模块,针对于生产环境
     */
    const pluginsPro = [
      new CompressionPlugin({
    // 文件开启Gzip,也可以通过服务端(如:nginx)
        filename: '[path].gz[query]',
        algorithm: 'gzip',
        test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'),
        threshold: 10240,// 对超过10k的数据压缩
        minRatio: 0.8// 只有压缩率小于这个值的资源才会被处理
      }),
      new BundleAnalyzerPlugin()
    ];

    /**
     * 调试模块,针对于开发环境
     */
    const pluginsDev = [
      new vConsolePlugin({
   
        filter: [], // 需要过滤的入口文件
        enable: false // 发布代码前记得改回 false
      })
    ];

    if (process.env.NODE_ENV === 'production') {
   
      // 生产环境,启用压缩
      config.plugins = [...config.plugins, ...pluginsPro];
    } else {
   
      // 开发环境,启用调试
      config.plugins = [...config.plugins, ...pluginsDev];
    }
  },
  devServer: {
   
    open: true,
    overlay: {
   
      warnings: false,
      errors: true
    },
    hotOnly: false,
    proxy: {
   
      "/": {
   
        target: 'http://0.0.0.0:8080/',// 服务器地址
        changeOrigin: true,
        secure: false,
        ws: true
      }
    }
  }
}

src/view/App.vue

created() {
   
    this.getUserById(10001);
},
methods: {
   
    async getUserById(userId) {
   
        const res = await this.$http.getUserById(userId);
        if (res.success) {
   
            this.$message({
   
              message: res.msg,
              type: "success",
            });
        } else {
   
            this.$message({
   
              message: res.msg,
              type: "warning",
            });
        }
    }
}

顺便附上单独使用Axios的 Get 和 Post 两种方式

// get
axios.get(
  url, 
  {
   
    params:{
   },
    headers : {
   
      'auth-token': sessionStorage.getItem('auth-token')
    }
  }
)
.then((res) => {
   
  console.log('get =>', res);
}).catch(err =>{
   
  console.error(err)
})

// post
axios.post(
  url,
  data,
  {
   
    headers: {
   
      'Content-Type': 'application/json',
    },
  }
)
.then((res) => {
   
  console.log('post =>', res)
}).catch(err =>{
   
  console.error(err)
})
目录
相关文章
|
7月前
|
JSON 前端开发 JavaScript
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
480 0
|
2月前
|
资源调度 JavaScript
|
2月前
|
缓存 JavaScript 搜索推荐
|
1月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
59 2
|
1月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
40 0
|
3月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
54 6
|
4月前
|
JSON JavaScript 前端开发
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
这篇文章讨论了在Vue项目中封装axios的最佳实践,包括设置接口请求前缀、请求头、状态码、请求方法的封装,以及如何使用请求和响应拦截器来处理token和响应状态,从而简化HTTP请求的配置和错误处理,提高代码的可维护性。
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
|
2月前
|
JavaScript API 开发工具
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
37 0
|
4月前
|
JavaScript C++
使用 Vite 创建 Vue3+TS 项目并整合 ElementPlus、Axios、Pinia、Less、Vue-router 等组件或插件
本文详细介绍了如何使用Vite创建Vue3+TypeScript项目,并整合ElementPlus、Axios、Pinia、Less、Vue-router等组件或插件的步骤和配置方法。
1868 1