Vue2 - 实现异步请求与服务器代理配置

一、实现ajax异步请求

方法一 使用axios实现ajax异步请求

Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js

Axios(相比于原生的XMLHttpRequest对象来说) 简单易用,(相比于jQuery)axios包尺寸小且提供了易于扩展的接口,是专注于网络请求的库。

在项目中,安装axios库。

npm i axios

在script标签内引入axios库

import axios from 'axios'

使用axios

const url='http://localhost:8080/students';
axios.get(url).then(
          //成功的回掉
          response=>{
            console.log("请求成功了");
            console.log(response);
            console.log(response.data);
          },
          //失败的回调
          error=>{
            console.log("请求失败了",error.message);
            console.log(error);
          }
      )
    

参考文档:http://www.axios-js.com/zh-cn/docs/


方法二 使用插件 vue-resource 实现(不推荐)

在项目里安装vue-resource插件

npm install vue-resource --save-dev

在main.js文件引入插件库,并使用插件

import Vue from 'vue'
import App from './App.vue'

import vueResource from 'vue-resource'//引入插件

Vue.config.productionTip = false
/  
   使用了插件 vue-resource 后,vc身上会多出来一个属性 $http (默认是没有该属性)
  /
Vue.use(vueResource)//使用插件

new Vue({
  render: h => h(App),
}).$mount('#app')

注意:使用了插件 vue-resource 后,vc身上会多出来一个属性 $http (默认是没有该属性)

使用方法

/  
  用 this.$http.get(url) 代替 axios.get(url)
  用法是一样的
 /
const url='http://localhost:8080/students';
this.$http.get(url).then(
      //成功的回掉
      response=>{
        console.log("请求成功了");
        console.log(response);
        console.log(response.data);
      },
      //失败的回调
      error=>{
        console.log("请求失败了",error.message);
        console.log(error);
      }
  )

与axios用法是一样的,用 this.$http.get(url) 代替 axios.get(url)

但 vue-resource 这个库现在的维护频率不高,推荐还是用axios (axios的封装比较优秀)


二、Vue脚手架配置服务器代理(解决跨域问题)

在vue.config.js配置devServer属性,即开启代理服务器,即以后的请求可以找代理服务器拿数据。

方法一 (不推荐)

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

 devServer:{
  proxy:"http://localhost:5000"
}

说明:

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

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

工作方式:

当请求的资源在前端服务器下有时,不会走代理转发给(后端)服务器。

当请求的资源在当前服务器下没有时 代理会通过vue.config.js文件中配置的devServer.proxy 目标服务器地址去请求数据,目标服务器再返回带代理,代理会自动返回到当前。

即若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)


方法二 (推荐)

编写vue.config.js配置具体代理规则:

module.exports = {
devServer: {
    proxy: {
    '/api1': {// 匹配所有以 '/api1'开头的请求路径
      target: 'http://localhost:5000',// 代理目标的基础路径
      pathRewrite: {'^/api1': ''},//请求时重写,将前缀目替换为空,解决在目标服务器跳转前缀目录404的问题
     // ws: true,//用于支持websocket ,默认true
       changeOrigin: false 
    },
    '/api2': {// 匹配所有以 '/api2'开头的请求路径
      target: 'http://localhost:5001',// 代理目标的基础路径
      changeOrigin: true,
      pathRewrite: {'^/api2': ''}
    }
  }
}
}
  • changeOrigin用于控制请求头中的host值==>修改访问时原始路径 (默认为true),目标服务器接收的发送端地址(即请求字段中的host字段):根地址会修改为与目标地址一致 localhost:500x,false则保持发送端的服务器地址 localhost:8080。

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

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

  • changeOrigin默认值为true。

说明:

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

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

实例:

 // const url='http://localhost:5001/students';//(未开启代理)这里是直接请求目标服务器,会出现跨域问题(可以通过配置代理服务器解决)
      /  
         开启代理后(方法一 测试)
        /
      const url='http://localhost:8080/students';
      axios.get(url).then(
          //成功的回调
          response=>{
            console.log("请求成功了");
            console.log(response);
            console.log(response.data);
          },
          //失败的回调
          error=>{
            console.log("请求失败了",error.message);
            console.log(error);
          }
      )
    },
  • (在vue.config.js文件中配置devServer.proxy(proxy:目标服务器的地址+端口) ==>通过脚手架配置代理服务器)

  • 请求地址改回脚手架自己原来的地址即可(代理服务器的地址与项目服务器的地址是一样的)==>

  • 流程:拿数据 => 直接向代理拿 =>当请求的资源在前端服务器下没有时 代理会通过vue.config.js文件中配置的devServer.proxy 目标服务器地址去请求数据,目标服务器再返回带代理,代理会自动返回到当前。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值