以勇气面对人生的巨大悲恸,用耐心对待生活的小小哀伤。——雨果
首先安装
# axios cnpm i --save axios # 格式化参数插件 cnpm i -- save qs # 对象合并插件 cnpm i -- save lodash # cookie操作 cnpm i -- save vue-cookie
|
然后我们自己封装一个请求组件
首先创建文件
然后放入我们的代码。。。
import axios from 'axios' import qs from 'qs' import merge from 'lodash/merge' import {Loading, Message} from 'element-ui' import VueCookie from 'vue-cookie';
const BASE_URL = process.env.NODE_ENV === 'production' ? process.env.VUE_APP_SERVER_URL : process.env.VUE_APP_BASE_API
axios.defaults.withCredentials = true
const http = axios.create({ timeout: 1000 * 30, withCredentials: true, headers: { 'Content-Type': 'application/json; charset=utf-8' }, notUseDefaultApi: false })
let loading http.interceptors.request.use(config => { let showLoading = false if (config.loading === true) { showLoading = true } if (showLoading) { loading = Loading.service({ text: config.loadingText || 'ruben正在全力为您加载中...', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' }) } config.headers.token = VueCookie.get('token') if (!config.notUseDefaultApi) { config.url = BASE_URL + config.url; } const method = config.method const params = {} const arrayFormat = config.headers.arrayFormat || 'indices' if (method === 'post' && config.headers['Content-Type'] === 'application/x-www-form-urlencoded; charset=utf-8') { config.data = qs.stringify(config.data, { allowDots: true, arrayFormat: arrayFormat }) } else if (method === 'get') { config.params = qs.stringify(config.params, { allowDots: true, arrayFormat: arrayFormat }) config.params = qs.parse(config.params) config.params = merge(params, config.params) } console.log(config) return config }, error => { return Promise.reject(error) })
let errorMessageAlertOption = { message: '请求错误', type: 'error', showClose: true, dangerouslyUseHTMLString: true, duration: 3000, customClass: 'el-icon-lightning' }
http.interceptors.response.use(response => { if (loading) { loading.close(); } if (response.data && response.data.success === false) { errorMessageAlertOption.message = response.data.msg Message(errorMessageAlertOption); } return response }, error => { if (loading) { loading.close(); } console.log(error) Message(errorMessageAlertOption) return Promise.reject(error) })
export default http
|
然后在main.js
引用
import Vue from 'vue' import App from './App.vue' import router from '@/router' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; import httpRequest from '@/utils/httpRequest' import VueCookie from 'vue-cookie';
Vue.use(ElementUI, httpRequest, VueCookie); Vue.config.productionTip = false
Vue.prototype.$http = httpRequest Vue.prototype.$cookie = VueCookie new Vue({ router, render: h => h(App), }).$mount('#app')
|
这里加了两个配置文件,别忘了
# 开发环境配置 ENV = 'development'
# 代理前缀 VUE_APP_BASE_API = '/ruben'
# URL VUE_APP_SERVER_URL = 'http://localhost:8080'
|
以及
# 生产环境配置 ENV = 'production'
VUE_APP_SERVER_URL = 'localhost:8080'
|
还有在vue的vue.config.js
配置文件中配置
module.exports = { devServer: { port: 3000, disableHostCheck: true, proxy: { '/ruben': { target: process.env.VUE_APP_SERVER_URL, changeOrigin: true, pathRewrite: { '^/ruben': '' } } } }
}
|
最后是使用
this.$http({ url: `/user/login`, method: 'post', data: this.inputForm }).then(({data}) => { if (data && data.success) { this.$message.success(data.msg) console.log(data) } });
|
完整代码放到了gitee
仓库
我会继续完善下去的~