vue-cil之axios的二次封装与proxy反向代理使用说明


Posted in Vue.js onApril 07, 2022

Axios与proxy反向代理

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

1、Axios 的特性

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

2、Axios 的安装

npm i axios
# 或者
yran add axios

3、Axios 与proxy反向代理的使用

在要进行使用的文件(request.js)里面导入

// 这是实现 axios 的二次分装
// 导入下载好的包
impront axios from 'axios'
// 创建 axios 实例
const service = axios.create({
    // 添加要对接的后端 url 接口
    // bassUrl: '<url>',
    // 设置超时时间
    timeout: 3000
})
// 请求拦截
service.interceptors.request.use(config => {
    // 可以添加一些响应头信息等
    
    return config
}) 
// 响应拦截
service.interceptors.response.use(res => {
    console.log('请求拦截', res)
    return res
})
// 导出
export default service

如果是对接多个后端接口,前端应用和后端API服务器没有运行在同一个主机上,你需要在开发环境下将API请求代理到 API服务器,就在vue.config.js 中书写如下代码

// vue.config.js
module.exports = {
  devServer:{
      // 更改端口号
      port: 9550,
      // 是否自动打开浏览器
      open: true,
      proxy: {
       // 这里是访问到以 /api 开头的 url 的时候会代理到target 目标上
          '/api': {
              target:'<url>',
              ws: true,
              changeOrigin:true,
              // 重新修改路径
              pathRewrite: {
                  '^/api': ''
              }
          }
      }
  }
}

注:为什么要重新修改路径,因为在发送请求后会在url中多拼接上一个 ’‘ /api ’‘ ,但是我们获取数据又不需要这个才能拿到,所以就要重新修改,把他拿掉;拿掉之后就可以获取到数据了

最后那个地方需要就直接导入service 然后调用就行了

axios反向代理proxy个人理解

使用反向代理proxy的原因

首先需要了解浏览器的同源策略,同源就是说比如你VUE的项目地址是“http://localhost:8080”,而你后端项目启动地址是‘http://localhost:9999’,两者中协议(http)、域名(localhost)相同,但是端口号(:xxxx)vue是8080,而后端是9999不相同,所以产生跨域,需要使用反向代理。(若两者满足协议、域名、端口号相同则不存在跨域问题)。

反向代理在我个人理解就是给你vue项目访问后端资源时给你套上的一个壳,让浏览器认为本次请求是同源的,浏览器就不会进行拦截,数据可以正常返回(类似vpn原理吧)。

proxy基本配置

module.exports = {
    devServer: {
        proxy: {
            '/proxyurl':{
                target:'http://localhost:9999',//起同源作用的url 简单来说就是你要访问的服务器
                //ws: true, 这个是 开启websocket
                changeOrigin: true,//字面意思:更改源点 很多人说是开启跨域 也可以这么理解
                pathRewrite: {
                    '^/proxyurl': '' //还有一种写法是'^/proxyurl': '/' 自测
                }
            }
        }
    }
}
//写个最简单的例子用法
//前端项目地址是 http://localhost:8080
//后端项目地址是 http://localhost:9999
    axios.get("/proxyurl/user/getalluser").then(res => {
        console.log(res);
    });

解释这个例子:

显然我们是通过vue项目访问了后端资源,抛开代理单看这段代码,是以http://localhost:8080/proxyurl/user/getalluser请求资源的。

但是有了反向代理,反向代理看到了你这段url中出现了’/proxyurl‘,反向代理起作用,将’/proxyurl‘前面这段’http://localhost:8080‘替换成了’http://localhost:9999‘,这时候请求资源的url变为‘http://localhost:9999/proxyurl/user/getalluser’。

但是我们又配置了一项pathRewrite: {'^/proxyurl': ''},'^/proxyurl'是正则表达式,它会匹配你url中的字符串。这一选项的代码意思是,将url中的’/proxyurl‘替换为空字符串。则现在的url是http://localhost:9999/user/getalluser

ps:通常我们会将axios封装,可以在创建axios实例时这样写

export function request(config){
    let axiosInstance = axios.create({
        baseURL: '/proxyurl', //在调用时拼接上后面的url就可以了
        timeout: 5000
    });
    return axiosInstance(config);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
Vue 组件注册全解析
Dec 17 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
Vue基本指令实例图文讲解
Feb 25 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
vue3获取当前路由地址
Feb 18 Vue.js
Vue.Draggable实现交换位置
Apr 07 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue实现拖拽交换位置
Apr 07 #Vue.js
Vue.Draggable实现交换位置
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
vue cli4中mockjs在dev环境和build环境的配置详情
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 #Vue.js
vue3使用vuedraggable实现拖拽功能
vue整合百度地图显示指定地点信息
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Python中的日期时间处理详解
2016/11/17 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
介绍一下write命令
2014/08/10 面试题
大学生职业生涯规划范文
2014/01/08 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
教师节随笔
2015/08/15 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS