前后端分离开发难免会遇到跨域问题,使用axios需要设置代理服务器,还要满足开发环境和生产环境同时运行正常,具体实现如下:

vue.config.js

module.exports = {
    devServer: {
        //proxy:"http://localhost:8080",
        host: "localhost",
        port: 8081,
        proxy: {
            // axios跨域代理实现
           '/api': {
             target:'http://localhost:8080', //请求的第三方接口
             changeOrigin:true, // 在本地会创建一个虚拟服务端
             pathRewrite:{  // 路径重写
               '^/api': ''  
             }
           }
        }
      },
};

main.js添加如下代码

import Axios from 'axios'
/*设置baseURL*/
let baseURL = '/api';
// process.env.NODE_ENV  用于判断当前运行环境,根据 npm run serve 或 npm run build 
if (process.env.NODE_ENV === 'production') {
  baseURL =  'http://localhost:8080';
}
Axios.defaults.baseURL = baseURL//自动附加在所有axios请求前面,可直接写'/xx/xx'。否则需要设置'/api/xx/xx' 

使用一(axious):

import Axios from 'axios'
async getTableData(XXX,XXX,XXX){
        var dataList = [];
        var count = 0;
        var url = "/XXXX/XX";
        await Axios.post( url , {}, 
            {
                headers: {
                  "Content-Type":"application/json;charset=utf-8",
                  "Access-Control-Allow-Origin":"*",
                  "Access-Control-Allow-methods":"OPTIONS"
                },
                withCredentials : true
        }).then(function(returnData) {// 这里是处理正确的回调
            dataList = returnData.data.dataList;
            count  = returnData.data.count;
        }).catch( function(response) {// 这里是处理错误的回调
            console.log(response);
        });
      }

此写法是同步请求,若无此需求async 和await 可以不加。因为是跨域,还设置了headers。
此时url会在前面自动加上之前设置好的/api,去创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据。
在这里插入图片描述

使用二(window.href.url):

import Axios from 'axios'
var url = Axios.defaults.baseURL + "/XXXX/XX";
window.location.href = url;//数据接口

使用非axious时需要加/api前缀(例如:/api/XXXX/XX)访问才行,但是加了/api后,生产环境不能帮你拿到对应的前缀。所以可以直接使用之前设置好的Axios.defaults.baseURL,这样就不会找不到了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐