Vue —— 进阶 AJAX(解决开发环境 Ajax 跨域问题)

简介: Vue —— 进阶 AJAX(解决开发环境 Ajax 跨域问题)

Vue 脚手架配置代理

一、方法一(只能代理一个服务器的情况)

1. 配置

在 vue.config.js 中添加如下:

  devServer: {
    proxy: 'http://localhost:5000'  
  }
2. 说明
  1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
  2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
  3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器(优先匹配前端资源)。
3. 实例
  1. 准备好 server1.js 服务器文件,当前文件夹下通过在 cmd 中键入 node server1 启动服务器,并在浏览器中打开。

6b89e9abcb304cdd8e156eec11b64cb8.png

  1. vue.config.js 中配置
    module.exports = {
      pages: {
        index: {
          // 入口
          entry: 'src/main.js',
        },
      },
      lintOnSave: false, //关闭语法检查
      // 开启代理服务器 (方式一)
      devServer: {
        proxy: 'http://localhost:5000'
      }
    }
  1. App.vue 获取学生的信息。需要提前在终端键入 npm i axios 安装 axios,并导入使用。
    <template>
      <div>
        <button @click="getStudents">获取学生信息</button>
      </div>
    </template>
    <script>
    import axios from "axios";
    export default {
      name: "App",
      methods: {
        getStudents() {
          axios.get("http://localhost:8080/students").then(
            (response) => {
              console.log("请求成功了", response.data);
            },
            (error) => {
              console.log("请求失败了", error.message);
            }
          );
        },
      },
    };
    </script>
  1. 2fe82dbeba9041beb1a142ef2136f159.png

二、方法二(可以代理多个服务器的情况)

1. 配置

在 vue.config.js 中添加如下:

    module.exports = {
      pages: {
        index: {
          // 入口
          entry: 'src/main.js',
        },
      },
      lintOnSave: false, //关闭语法检查
    // 开启代理服务器 (方式二)
    devServer: {
      proxy: {
        '/api1': { //匹配所有以 /api1 开头的请求路径
            target: 'http://localhost:5000', //代理目标的基础路径
            pathRewrite: {'^/demo': ''}, //去掉请求头匹配目标地址
            ws: true, //用于支持 websocket
            changeOrigin: true //用于控制请求头中的 host值
          }
        }
      }
    }

注意:


changeOrigin 设置为 true 时,服务器收到的请求头中的 host 为:localhost: 5000

changeOrigin 设置为 false 时,服务器收到的请求头中的 host 为:localhost: 8000

changeOrigin 默认值为 true

2. 说明
  1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
  2. 缺点:配置略微繁琐,请求资源时必须加前缀。
3. 实例
  1. 准备好 server1.js 和 server2.js 服务器文件,当前文件夹下通过在 cmd 中键入 node server1 启动服务器 server1,通过键入 node server2 启动服务器 server2,并在浏览器中打开。

6b89e9abcb304cdd8e156eec11b64cb8.png

31fb178d39724dae872ee2c6b8153592.png

  1. vue.config.js 中配置
  module.exports = {
    pages: {
      index: {
        // 入口
        entry: 'src/main.js',
      },
    },
    lintOnSave: false, //关闭语法检查
    // 开启代理服务器 (方式二)
    devServer: {
      proxy: {
        // /api:请求前缀
        '/demo': {
          target: 'http://localhost:5000',
          pathRewrite: {
            '^/demo': ''
          }, //去掉请求头匹配目标地址
          ws: true, //用于支持 websocket
          changeOrigin: true //用于控制请求头中的 host值
        },
        '/test': {
          target: 'http://localhost:5001',
          pathRewrite: {
            '^/test': ''
          }, //去掉请求头匹配目标地址
          ws: true, //用于支持 websocket
          changeOrigin: true //用于控制请求头中的 host值
        }
      }
    }
  }
  1. App.vue 获取学生和汽车的信息。
    <template>
      <div>
        <button @click="getStudents">获取学生信息</button>
        <button @click="getCars">获取汽车信息</button>
      </div>
    </template>
  <script>
  import axios from "axios";
  export default {
    name: "App",
    methods: {
      getStudents() {
        axios.get("http://localhost:8080/demo/students").then(
          (response) => {
            console.log("请求成功了", response.data);
          },
          (error) => {
            console.log("请求失败了", error.message);
          }
        );
      },
      getCars() {
        axios.get("http://localhost:8080/test/cars").then(
          (response) => {
            console.log("请求成功了", response.data);
          },
          (error) => {
            console.log("请求失败了", error.message);
          }
        );
      }
    },
  };

742ace8d209640769297950b347ee6bd.png

三、注意事项

方法一虽然配置简单,但一次只能代理 一个 服务器。方法二一次可以代理 多个 服务器。

vue.config.js 中配置的地址是 500x(5050),在 App.vue 中 axios 通过 get 得到的地址是 808x(8080)。

方法二在配置过程中,要对请求头通过正则表达式进行 重写,这样可以去掉 axios 请求地址的请求前缀,才能正确匹配。

不积跬步无以至千里 不积小流无以成江海

相关文章
|
3天前
|
JavaScript 前端开发
【vue】iview如何把input输入框和点击输入框之后的边框去掉
【vue】iview如何把input输入框和点击输入框之后的边框去掉
10 0
|
4天前
|
资源调度 JavaScript 前端开发
Vue的路由管理:VueRouter的配置和使用
【4月更文挑战第24天】VueRouter是Vue.js的官方路由管理器,用于在单页面应用中管理URL路径与组件的映射。通过安装并引入VueRouter,设置路由规则和创建router实例,可以实现不同路径下显示不同组件。主要组件包括:`&lt;router-link&gt;`用于创建导航链接,`&lt;router-view&gt;`负责渲染当前路由对应的组件。此外,VueRouter还支持编程式导航和各种高级特性,如嵌套路由、路由参数和守卫,以应对复杂路由场景。
|
2天前
|
监控 JavaScript
Vue中的数据变化监控与响应——深入理解Watchers
Vue中的数据变化监控与响应——深入理解Watchers
|
2天前
|
JavaScript 安全 前端开发
Vue 项目中的权限管理:让页面也学会说“你无权访问!
Vue 项目中的权限管理:让页面也学会说“你无权访问!
11 3
|
2天前
|
JavaScript 前端开发 开发者
Vue的神奇解锁:冒险的开始
Vue的神奇解锁:冒险的开始
5 1
|
3天前
|
JavaScript
【vue实战】父子组件互相传值
【vue实战】父子组件互相传值
9 1
|
3天前
|
JavaScript
vue2_引入Ant design vue
vue2_引入Ant design vue
8 0
|
3天前
|
JavaScript
vue知识点
vue知识点
13 4
|
4天前
|
存储 JavaScript 前端开发
【Vue】绝了!这生命周期流程真...
【Vue】绝了!这生命周期流程真...
|
4天前
|
JavaScript 索引
【vue】框架搭建
【vue】框架搭建
7 1