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拦截器有哪些区别
Dec 19 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
vue实现登陆页面开发实践
May 30 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中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
js中replace的用法总结
2013/12/27 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python中字典和集合学习小结
2017/07/07 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
详解重置Django migration的常见方式
2019/02/15 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
最新会计专业求职信范文
2014/01/28 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
不错的求职信范文
2014/07/20 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
2019秋季运动会口号
2019/06/25 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL