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中通过render函数给子组件设置ref操作
Nov 17 Vue.js
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vuex的使用步骤
Jan 06 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue/cli 配置动态代理无需重启服务的方法
May 20 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php中取得URL的根域名的代码
2011/03/23 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
在Django的session中使用User对象的方法
2015/07/23 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python如何获取apk的packagename和activity
2020/01/10 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Python可以实现栈的结构吗
2020/05/27 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
简单html5代码获取地理位置
2014/03/31 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
乡镇办公室工作决心书
2014/03/11 职场文书
商业项目策划方案
2014/06/05 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
小学感恩主题班会
2015/08/12 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers