我尝试使用webpack-dev-server代理配置向外部域发送api请求,但我似乎无法使其正常工作。
这是我的配置:
var path = require('path')
module.exports = {
entry: './client/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'public/assets'),
publicPath: 'assets'
},
devServer: {
contentBase: 'public',
proxy:{
'/api/v1*': {
target: 'http://laravelandwebpack.demo/',
secure: false
}
}
}
}
因此,只要我的应用使用uri /api/v1...
发出请求,它就应该将该请求发送给http://laravelandwebpack.demo
。
在我的Vue应用中,我使用vue-resource
发出请求,并且我使用所需的uri前缀默认所有请求:
var Vue = require('vue')
Vue.use(require('vue-resource'))
new Vue({
el: 'body',
http: {
root: '/api/v1', // prefix all requests with this
headers:{
test: 'testheader'
}
},
ready: function (){
this.$http({
url: 'tasks',
method: 'GET'
}).then(function (response){
console.log(response);
}, function (response){
console.error(response);
})
}
})
网址正在构建正确,但他们仍然指向localhost:8080
这是webpack-dev-server:
我阅读并重新阅读了webpack-dev-server的文档,但我无法弄清楚我在哪里设置错误。有什么想法吗?
答案 0 :(得分:1)
我找到了针对该问题的解决方案。在我的情况下,我需要将请求代理到我的后端以获取任何/api/*
路径,因此我绕过了任何不以api开头的请求。
样品:
proxy: {
'*': {
target: 'http://localhost:8081',
secure: false,
rewrite: function(req) {
console.log('rewriting');
req.url = req.url.replace(/^\/api/, '');
},
bypass: function(req, res, proxyOptions) {
if (req.url.indexOf('api') !== 0) {
console.log('Skipping proxy for browser request.');
return '/index.html';
}else{
return false;
}
}
}
}
答案 1 :(得分:1)
@Linus Borg是正确的。
URL的构造正确,但它们仍指向localhost:8080,即webpack-dev-server:
这无关紧要。
就我而言,我想获得http://m.kugou.com/?json=true
。我正在使用@Vue/cli ^3.0.0-beta.15
,也许您需要根据情况修改代码。
所以,这就是我所做的:
App.vue
axios.get('/proxy_api/?json=true').then(data => {
console.log('data', data)
})
vue.config.js
module.exports = {
devServer: {
proxy: {
// proxy all requests whose path starting with /proxy_api to http://m.kugou.com/proxy_api then remove '/proxy_api' string
'/proxy_api': {
target: 'http://m.kugou.com',
pathRewrite: {
'^/proxy_api': '/'
}
}
}
//or just change the origin to http://m.kugou.com
// proxy: 'http://m.kugou.com'
}
}
我使用/proxy_api/?json=true
,然后通过http://m.kugou.com/?json=true
和target
将其更新为pathRewrite
。
'/proxy_api'
用于区分是否应代理该网址。
我为什么要使用/proxy_api
?容易区分。
我从http://m.kugou.com/?json=true
获得数据,而开发工具中的网址为http://localhost:8080/proxy_api/?json=true
。
看到了吗?没关系。