Vue脚手架配置代理

可以配制出一个代理服务器,用于解决跨域问题。

代理服务器的端口号和Vue端口号相同,所以访问代理服务器时不存在跨域问题。

方法一:

在vue.config.js中添加配置:

  1. devServer: {
  2. proxy:'http://localhost:5000'
  3. }

页面中本来请求5000端口服务器的url改为请求8080代理服务器(vue端口号是8080,代理服务器端口号和vue端口号相同):

  1. // 原本要请求localhost:5000/students,现在发给代理服务器localhost:8080
  2. axios.get('http://localhost:8080/students').then(
  3. response => {
  4. console.log('请求成功了', response.data)
  5. },
  6. error => {
  7. console.log('请求失败了', error.message)
  8. }
  9. )

优点:配置简单,请求资源时直接发送给前端8080端口即可

缺点:不能配置多个代理,不能灵活的控制请求是否走代理

工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器。优先匹配项目中已有的资源,例如http://localhost:8080/favicon.ico获取到的是本地的文件,而不会转发给服务器。

方法二:

在vue.config.js中添加配置:

  1. devServer: {
  2. proxy: {
  3. '/test': { // 请求前缀
  4. target: 'http://localhost:5000',
  5. pathRewrite: {'^/test': ''}, // 请求服务器时去掉/test前缀
  6. ws: true, // 用于支持WebSocket,默认true
  7. changeOrigin: true // 用于控制请求头的host值,默认true
  8. },
  9. '/demo': {
  10. target: 'http://localhost:5001',
  11. pathRewrite: {'^/demo': ''},
  12. ws: true,
  13. changeOrigin: true
  14. },
  15. }
  16. }

页面中请求路径需要加上指定的前缀:

  1. // 请求localhost:8080/test 会被转发给localhost:5000
  2. axios.get('http://localhost:8080/test/students').then(
  3. response => {
  4. console.log('请求成功了', response.data)
  5. },
  6. error => {
  7. console.log('请求失败了', error.message)
  8. }
  9. )

相关参数:

  • pathRewrite:修改请求资源路径。

    默认情况下,请求的资源路径会被直接转发给服务器,例如http://localhost:8080/test/students会被转发成http://localhost:5000/test/students。如果要去掉前缀test,需要在pathRewrite中使用正则表达式替换掉。

  • ws:用于支持WebSocket,默认true

  • changeOrigin:用于控制请求头的host,默认true

    changeOrigin为false时,代理服务器发给服务端的请求来源host为代理服务器真实的host,服务端接收到的请求来源的host为:localhost:8080

    changeOrigin为true时,代理服务器会“欺骗”服务端,用服务端的host当做请求来源host,服务端接收到的请求来源的host为:localhost:5000

    一般情况下,将该项设置为true(默认值)。防止服务端加了请求来源必须为同源的限制

优点:可以配置多个代理,且可以灵活的控制请求是否走代理

缺点:配置略微繁琐,请求资源时必须加前缀

常用的ajax技术对比

常用的ajax技术:

  • xhr(XMLHttpRequest):原生window自带的对象,可以直接使用。但是用法繁琐,很少使用
  • Jquery:可以使用$.get、$.post进行ajax操作,但Jquery中大部分工作是便于操作DOM,而Vue中要尽量避免DOM操作,所以VUE中不推荐使用Jquery
  • axios:封装的promise风格的ajax请求,需要引入axios库。最常用。
  • fetch:也可以使用promise风格的ajax请求。fetch是js内置的,不依赖xhr。但是fetch会将返回的数据包装两层promise,而且不兼容IE浏览器。
  • vue-resource:vue的插件,用法和axios完全一样,但是很久没有维护了,在vue1.0时代用的较多

axios的使用:

  1. 安装axios

    1. npm i axios
  2. 引入并使用
    ```javascript import axios from ‘axios’

axios.get(‘http://localhost:8080/students').then( response => { console.log(‘请求成功了’, response.data) // 响应数据存在response的data属性中 }, error => { console.log(‘请求失败了’, error.message) // 错误信息存在error的message属性中 } )

  1. vue-resource的使用:
  2. 1. 安装vue-resource
  3. ```sh
  4. npm i vue-resource
  1. 在main.js中应用插件
    ```javascript import vueResource from ‘vue-resource’

// 使用该插件后,vm和vc对象都会多出来一个$http属性 Vue.use(vueResource)

  1. 3. 使用vue-resource发送请求
  2. ```javascript
  3. // 使用vue-resource插件后,vm和vc会多出来$http属性
  4. // 使用$http发送请求和使用axios发送请求的写法一模一样
  5. this.$http.get('http://localhost:8080/students').then(
  6. response => {
  7. console.log('请求成功了', response.data)
  8. },
  9. error => {
  10. console.log('请求失败了', error.message)
  11. }
  12. )

常用解决跨域的方法

常用的解决跨越的方法:

  • cors:不需要前端做任何操作。需要在后台代码中,将响应头添加几个特殊响应头
  • jsonp:巧妙的借助了<script>标签的src属性在引入外部资源时不受同源策略限制的特点办到的。只能解决get请求的跨域问题,而且需要前端、后台都配合进行改造。不常用。
  • 配置代理服务器