vue项目 打包放到服务器上之后 如何能做到 模块1 请求www.xxx1.com的接口,模块2请求www.xxx2.com的接口.... ..
这种能实现吗?需要怎么配置 动态配置
vue项目 打包放到服务器上之后 如何能做到 模块1 请求www.xxx1.com的接口,模块2请求www.xxx2.com的接口.... ..
这种能实现吗?需要怎么配置 动态配置
当然可以。你可以通过配置axios或者vue-request等http请求库来实现这个需求。下面以axios为例,给出一个基本的配置方法:
首先,安装axios:
npm install axios --save
然后,在main.js或者需要请求的模块中,导入axios并配置默认请求头信息:
import axios from 'axios'
axios.defaults.baseURL = 'http://www.xxx1.com' // 根据实际需要更改
axios.defaults.headers.common['Authorization'] = 'Bearer token' // 根据实际需要更改
在这里,baseURL
是你的默认请求url,后面的请求都会在这个url的基础上加上具体的请求路径。而Authorization
是一个示例,代表你的请求需要授权,你需要替换成实际的token。你也可以在这里添加其他的公共请求头信息。
然后,在你的组件中发起请求:
axios.get('/api/data') // 这里的'/api/data'是请求的具体路径,需要根据实际需要更改
这样,你就可以在所有请求中默认使用http://www.xxx1.com
作为请求url,并可以在每个请求中指定具体的路径。如果你需要使用不同的url,你可以在每个请求中指定不同的路径或者使用不同的http方法。
对于模块2的请求url是www.xxx2.com
的情况,你可以在axios的配置中使用baseURL
来区分:
import axios from 'axios'
axios.defaults.baseURL = 'http://www.xxx2.com' // 根据实际需要更改
axios.defaults.headers.common['Authorization'] = 'Bearer token' // 根据实际需要更改
然后,在你的模块2的组件中使用axios发起请求:
axios.get('/api/data') // 这里的'/api/data'是请求的具体路径,需要根据实际需要更改
这样,你就可以在模块2的所有请求中默认使用http://www.xxx2.com
作为请求url,并可以在每个请求中指定具体的路径。
线上发布一般都需要使用nginx反向代理实现不同接口访问不同服务,比如
server {
listen 8080;
listen [::]:8080;
server_name localhost;
location /api1 {
proxy_pass http://服务网关1;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
}
location /api2 {
proxy_pass http://服务网关2;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
上生产的话一般都是相对路径请求的,你在页面中模块1的接口一般会有/m1/xxx
的标识,模块2的接口也会有/m2/xxx
的标识。
开发环境下,你肯定是通过配置代理的方式/m1
和/m2
开头的API分别代理到不同的服务。同理,在开发环境下,也是如此,不过把vue
代理改成了nginx
我一般大概是这样做的,可以参考一下,项目中可能会复杂一点
// 是否开发模式
const isDev = true
const prefixMap = isDev ? {
'API_01': 'http://192.168.0.199:456',
'API_02': 'http://192.168.0.211:8080',
} : {
'API_01': 'https://www.baidu.com',
'API_02': 'https://www.google.com',
}
export default function request (options) {
return axios({
baseURL: prefixMap[options.baseURL],
url: options.url
})
}
// 使用自己封装的函数
request({
baseURL: 'API_01',
url: '/get/userinfo/'
})
6 回答3k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
2 回答982 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
想了两个方案,一个是axios创建实例的时候就不同前缀,一个是加入拦截器改写配置。
从长远来说,还是分开比较好。
方案2
调用
ps 注意代码健壮性,我就演示一下思路