欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > vue 配置代理 及 axios 请求封装和使用

vue 配置代理 及 axios 请求封装和使用

2024/11/2 18:17:50 来源:https://blog.csdn.net/hefeng_aspnet/article/details/142210168  浏览:    关键词:vue 配置代理 及 axios 请求封装和使用

一. 配置代理 -  vue.config.js

 
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  // 配置代理服务器
  devServer: {
    proxy: {
      '/baidu': {
        target: 'https://baidu.com',
        // ws: true,                            // 用于支持websocket
        changeOrigin: true,                  // 用于控制请求头中的host值
        pathRewrite: {
          '^/baidu': ''
        }
      },
      // 配置更多代理...
    }
  }
})

由上面代码可知 配置一个  /baidu 的代理 , 当匹配到 /baidu ,会跳转到目标target  https://baidu.com

二. 封装axios.js 

目录:  utils/axios.js

因为axios的baseUrl 配置 会影响vue.config.js中配置的代理,可能会使其失效。所以需要根据url 来对baseURL做处理。如果是代理路径,则baseURL设置为空

import axios from 'axios'  // 导入axios
 
 
/**
 * 当前路径是否为需要代理的路径
 * @param {*} url 
 * @returns 
 */
function currentUrlIsProxy(url) {
    const proxyArr = ['baidu','代理路径2','代理路径3'] // 需要代理的路径数组 - 即vue.config.js 中配置的代理路径集合
    const activeProxy = proxyArr.find(proxyItem => url.indexOf(proxyItem) !== -1)
    return activeProxy ? true : false
}
 
/**
 * axios请求
 * @param {*} method 
 * @param {*} url 
 * @param {*} params 
 * @param {*} headers 
 * @returns 
 */
export function apiAxios (method, url, params, headers) {
    var httpDefault = {
      baseURL: currentUrlIsProxy(url) ? '' : process.env.VUE_APP_BASE_URL,//基本地址
      method: method,//请求的方法
      url: url,//接口地址
      params: method === 'GET' || method === 'DELETE' ? params : null,//get请求和delete请求参数在url地址后面,不在请求体当中
      data: method === 'POST' || method === 'PUT' ? params : null,//put请求,post请求参数在请求体当中
      headers:headers?Object.assign({}, axios.defaults.headers,headers):axios.default.headers,//判断接口有没有定制的请求头,与基本的请求头进行合并
    }
    return new Promise((resolve, reject) => {
      axios(httpDefault)
        .then((res) => {
          resolve(res)
        }).catch((response) => {
          reject(response)
          // this.$message.error('请求失败!')
        })
    })
}

三.main.js 使封装的axios.js 可以全局使用

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import { apiAxios } from './utils/axios' // 导入
 
Vue.config.productionTip = false
Vue.prototype.$http = apiAxios // 全局配置
 
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')


四.使用

使用组件的.vue

<template>
  <div>
 
  </div>
</template>
 
<script>
export default {
    data() {
        return {
 
        }
    },
    mounted() {
        this.$http('get','/login_register_index',{request_time: '1663311028554'}).then(() => {
            // 这里的baseUrl 为 https://market.idcsmart.com
            // 这里实际请求的是  https://market.idcsmart.com/login_register_index
        }).catch(error => {
            console.log(error)
        })
 
        this.$http('get','/baidu/login_register_index',{request_time: '1663311028554'}).then(() => {
            // 匹配到 代理路径 /baidu
            // 这里实际请求的是  https://www.baidu.com/login_register_index  说明代理配置成功!
        }).catch(error => {
            console.log(error)
        })
 
    }
}
</script>
 
<style>
 
</style>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com