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项目利用axios请求接口下载excel
Nov 17 Vue.js
Vue router安装及使用方法解析
Dec 02 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
vue3中的组件间通信
Mar 31 Vue.js
vue项目两种方式实现竖向表格的思路分析
Apr 28 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue封装数字翻牌器
Apr 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
PHP中strtotime函数使用方法分享
2012/01/10 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
php算法实例分享
2015/07/14 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
Javascript函数的参数
2015/07/16 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
详解Python中for循环的使用方法
2015/05/14 Python
简单谈谈python中的多进程
2016/11/06 Python
用Python设计一个经典小游戏
2017/05/15 Python
python super的使用方法及实例详解
2019/09/25 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
中学生学习生活的自我评价
2013/10/26 职场文书
英语国培研修感言
2014/02/13 职场文书
2014年安全生产责任书
2014/07/22 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
基于JavaScript实现省市联动效果
2021/06/22 Javascript