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+iview实现文件上传
Nov 17 Vue.js
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
vue单元格多列合并的实现
Nov 26 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
Vue vee-validate插件的简单使用
Jun 22 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
vue修饰符.capture和.self的区别
Apr 22 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
php 函数使用方法与函数定义方法
2010/05/09 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
js全屏显示显示代码的三种方法
2013/11/11 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
javascript常见用法总结
2014/05/22 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python 字符串操作方法大全
2014/03/11 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python实现在线翻译功能
2020/03/03 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
Django URL参数Template反向解析
2020/11/24 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
Java基础知识面试题
2014/03/25 面试题
OpenCV全景图像拼接的实现示例
2021/06/05 Python
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis