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 02 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
vue el-table实现递归嵌套的示例代码
Aug 14 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中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
vue刷新和tab切换实例
2018/02/11 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
基于Django contrib Comments 评论模块(详解)
2017/12/08 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
Python发展史及网络爬虫
2019/06/19 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
如何撰写岗位职责
2014/02/01 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
班主任班级寄语大全
2014/04/04 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
社会实践活动报告
2015/02/05 职场文书
护士医德医风心得体会
2016/01/25 职场文书
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android