在开发项目平台的过程中遇到了这样的问题:就是后台给的接口是两个完全不一样的端口
所以,就需要有一个跨域多代理的设置方案了。
于是我就上网找了找解决方法,这是原创作者的文章,分享给大家:
https://blog.csdn.net/qq_35090611/article/details/121157526
第一步,配置环境变量 .env.development
在.env.development有默认VUE_APP_BASE_API,我们现在为请求腾讯地址API再声明一个全局变量VUE_APP_BASE_API_TX
# 请求后台专用接口全局变量
VUE_APP_BASE_API = '/dev-api'
# 请求腾讯地址全局变量
VUE_APP_BASE_API_TX = '/iotfrontapi'
第二步,配置根目录下的 vue.config.js
1.在新版的vue-element-admin中,已经安装好了代理,不需要再进行代理安装。
2.在config文件中找到proxy,这里就是进行代理配置的地方。如果在实际的项目中需要请求多个不同的第三方API接口地址,即在proxy中,进行代理配置。
devServer: {
port: port,
open: true,
overlay: {
warnings: false,
errors: true
},
proxy: {
[process.env.VUE_APP_BASE_API]: {
target: "http://127.0.0.1:8080", // 请求的第三方接口地址
changeOrigin: true, // 请求跨域时,需配置此项
pathRewrite: { // 路径重写,替换target中的请求地址
["^"+process.env.VUE_APP_BASE_API]: "",
},
},
[process.env.VUE_APP_BASE_API_TX]: {
target: "https://hubianluanzao.com", // 请求的第三方接口地址
changeOrigin: true, // 请求跨域时,需配置此项
pathRewrite: { // 路径重写,替换target中的请求地址
["^"+process.env.VUE_APP_BASE_API_TX]: "",
},
},
},
},
第三步, 配置 src/utils/ 下的request.js
request.js是框架中默认配置的请求拦截器,在request.js中可以对请求和响应进行拦截处理。如果只需要配置一个代理,那直接在request.js中配置即可,因为在本项目中,我们要请求的是腾讯地址的接口,即要进行多个代理,可以也在request.js中进行配置,也可以为配置一个专用的请求拦截器,我们这个是配置了一个专用的请求拦截器,即将request.js文件复制一份,命名为request_tx.js。
import axios from 'axios'
import {
Notification,
MessageBox,
Message
} from 'element-ui'
import store from '@/store'
import {
getToken
} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API_TX,
// 超时
timeout: 10000
})
// request拦截器
service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?';
for (const propName of Object.keys(config.params)) {
const value = config.params[propName];
var part = encodeURIComponent(propName) + "=";
if (value !== null && typeof (value) !== "undefined") {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && typeof (value[key]) !== 'undefined') {
let params = propName + '[' + key + ']';
let subPart = encodeURIComponent(params) + '=';
url += subPart + encodeURIComponent(value[key]) + '&';
}
}
} else {
url += part + encodeURIComponent(value) + "&";
}
}
}
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
return config
}, error => {
console.log(error)
Promise.reject(error)
})
// 响应拦截器
service.interceptors.response.use(res => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
if (code === 401) {
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
store.dispatch('LogOut').then(() => {
location.href = this.$router.options.base + '/index';
})
}).catch(() => {});
return Promise.reject('令牌验证失败')
} else if (code === 500) {
Message({
message: msg,
type: 'error'
})
return Promise.reject(new Error(msg))
} else {
return res.data
}
},
error => {
console.log('err' + error)
let {
message
} = error;
if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
Message({
message: message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
export default service
这里对request_tx.js进行了简单处理,没有做过多的配置。
第四步,配置 /src/api/ 下的请求接口
在请求不同的第三方时,使用的请求需要以对应,否则会报错。
// 引入请求管理后台文件
import request from '@/utils/request'
// 引入请求腾讯地图文件
import requestTx from '@/utils/request_tx'
// 获取腾讯地图地址解析接口
export function getTenctChang(param){
return requestTx({ // 注意这里请求腾讯地图API,所以使用的是requestTx
url: '/login/geocoder', // 我自己这里是这么写的 url: 'iotfrontapi/login/geocoder',要不一直报404
method: 'get',
params: param,
})
}
// 获取用户信息
export function getUserInfo(param){
return request({ // 注意这里请求应用后台API,所以使用的是request
url: '/user/info',
method: 'get',
params: param,
})
}
以上就是vue-element-admin 前端解决跨域多代理设置方案了
如果这篇文章对你有帮助,或者在进行中遇到其他问题,欢迎评论区留言出来。
我们一起探讨~