vue cli+axios 代理跨域proxy

vue cli脚手架前端调后端数据接口时候的本地代理跨域问题:

如在本地localhost访问接口http://182.131.18.102:8602/是要跨域的,会报错XMLHTTPRequest can not load http://182.131.18.102:8602/. Response to preflight request doesn’t pass access control…. 

解决方案:

在webpack配置一下proxyTable,config/index.js代码如下:

dev: {

    //加入代码

    proxyTable: {

      //处理跨域
      '/api': {
        target: 'http://182.131.18.102:8602/',//设置调用的接口域名和端口号
        changeOrigin: true,
        pathRewrite: {
          '^/api': '/'//这里理解成用‘/api’代替target里面的地址,后面组件中我们调接口时直接用api代替 比如我要调用'http://182.131.18.102:8602/login/login',直接写'/api/login/login'即可
        }
      }

    },

跨域成功了,但是注意了,这只是开发环境(dev)中解决了跨域问题,生产环境中真正部署到服务器上如果还是存在跨域问题,需要前后端联调:

第一步:前端部分可以分生产production和开发development两种环境分别测试,在config/dev.env.js(开发环境)和prod.env.js(生产环境)分别配置一下请求的地址API_HOST,开发环境中我们用上面配置的代理地址api,生产环境下用正常的接口地址,如下配置

config/dev.env.js配置如下

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',//开发环境
  API_HOST:"/api/"

})

prod.env.js配置如下

module.exports = {
  NODE_ENV: '"production"',//生产环境
  API_HOST:'"http://182.131.18.102:8602/"'
}

当然不管是开发还是生产环境都可以直接请求http://182.131.18.102:8602/。配置好之后测试时程序会自动判断当前是开发还是生产环境,然后自动匹配API_HOST,我们在任何组件里都能用process.env.API_HOST来使用地址如
axios.post(process.env.API_HOST+'user/login', .then(res => {
    console.log(res.data)
  }).catch(err =>{
  console.log(err);
  }))
第二步:后端服务器配置一下cros跨域即可,就是access-control-allow-origin:*允许所有访问的意思。

综上:开发的环境下我们前端可以自己配置个proxy代理就能跨域了,真正的生产环境下还需要后端的配合的。此方法ie9及以下不好使,如果需要兼容,最好的办法是后端在服务器端口加个代理,效果类似开发时webpack的代理。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以给你提供一个基本的思路和代码示例。首先,我们需要搭建一个后端 API 接口,用于提供商品数据。然后,我们使用 Vue3 作为前端框架,使用 axios 库来进行数据请求,同时使用 HTML5 和 CSS3 来实现页面布局和样式。 以下是一个简单的示例: ### 后端 API 接口 我们可以使用 Node.js 和 Express 框架来搭建一个简单的 API 接口,用于提供商品数据。假设我们有一个 `products` 路由,可以通过 GET 请求获取商品列表数据。 ```javascript const express = require('express'); const app = express(); app.get('/products', (req, res) => { const products = [ { id: 1, name: '商品1', price: 100 }, { id: 2, name: '商品2', price: 200 }, { id: 3, name: '商品3', price: 300 }, ]; res.json(products); }); app.listen(3000, () => { console.log('Server is running at http://localhost:3000'); }); ``` ### 前端页面 我们使用 Vue3 来搭建一个简单的页面,用于展示商品列表。在页面中,我们通过 axios 库来请求后端 API 接口,获取商品数据并展示在页面中。 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>商品列表</title> <link rel="stylesheet" href="https://unpkg.com/tailwindcss/dist/tailwind.min.css"> </head> <body> <div id="app" class="container mx-auto"> <h1 class="text-3xl font-bold mb-4">商品列表</h1> <div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"> <div v-for="product in products" :key="product.id" class="bg-white shadow-md rounded-lg overflow-hidden"> <img :src="product.image" class="w-full h-48 object-cover"> <div class="p-4"> <h2 class="font-bold text-xl mb-2">{{ product.name }}</h2> <p class="text-gray-700 text-base">{{ product.price }} 元</p> </div> </div> </div> </div> <script src="https://unpkg.com/vue@next"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> const app = Vue.createApp({ data() { return { products: [] } }, created() { axios.get('http://localhost:3000/products') .then(response => { this.products = response.data; }) .catch(error => { console.log(error); }); } }); app.mount('#app'); </script> </body> </html> ``` 在上面的示例代码中,我们使用了 Tailwind CSS 来实现页面布局和样式。通过 `v-for` 指令循环遍历商品列表,并将商品数据展示在页面中。 ### 跨域处理 由于前端页面和后端 API 接口可能存在跨域问题,我们需要进行跨域处理。在 Express 中,我们可以使用 `cors` 中间件来实现跨域处理。 ```javascript const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors()); // ... ``` 在 Vue3 中,我们可以使用 `vue-cli` 来创建项目,并在 `vue.config.js` 文件中进行跨域配置。 ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: { '^/api': '' } } } } }; ``` 在上面的配置中,我们将 `/api` 路径映射到后端 API 接口的根路径,并将请求转发到后端 API 接口。同时,我们设置 `changeOrigin` 为 `true`,以支持跨域请求。 这样,我们就可以通过 `http://localhost:8080/api/products` 来访问后端 API 接口,并获取商品数据了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值