Axios封装-基础篇

2023-10-29

前言:

在项目中与后台交互数据这块,通常用的是axios,Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。vue是有自己请求数据的方式,vue-resource,把方法抽象出来后,总需要往方法里传 this.$http ,感觉是个超级不爽的设计,在vue2的时候弃用,所以现在大部分还是用的是Axios。

一.axios的特点:

1.从浏览器中创建 XMLHttpRequests
2.从 node.js 创建 http 请求
3.支持 Promise API
4.拦截请求和响应 (就是有interceptor)
5.转换请求数据和响应数据
6.取消请求
7.自动转换 JSON 数据
8.客户端支持防御 XSRF
inteceptro
inteceptro
inteceptro
发送请求前
处理请求
发送请求后接收响应
successCallback
errorCallback

二.axios的封装:

1.先下载axios和qs
	npm install axios -S
	npm install qs --save

qs是一个npm仓库所管理的包。详情使用见npm官网:https://www.npmjs.com/

2.创建http.js,引入axios和qs
2.1环境的切换:
switch (process.env.NODE_ENV) {
    case "production": 
        axios.defaults.baseURL = "http://api.zhufengpeixun.cn";
        break;
    case "test": 
        axios.defaults.baseURL = "http://192.168.20.12:8080";
        break;
    default:
        axios.defaults.baseURL = "http://127.0.0.1:3000";
}

设置后就不用来回更换地址测试,更加方便快捷。

2.2设置超时时间和跨域是否允许携带凭证
	axios.defaults.timeout = 10000;
	axios.defaults.withCredentials = true;
2.3设置请求传递数据的格式(看服务器要求什么格式)
	axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
	axios.defaults.transformRequest = data => qs.stringify(data);
2.4post请求头的设置
	axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
2.5请求拦截

设置请求拦截器
客户端发送请求 - > [请求拦截器] - > 服务器
TOKEN校验(JWT):接收服务器返回的token,存储到vuex/本地存储中,每一次向服务器发请求,我们应该把token带上.

axios.interceptors.request.use(config => {
    // 携带上token
    let token = localStorage.getItem('token');
    token && (config.headers.Authorization = token);
    return config;
}, error => {
    return Promise.reject(error);
});
2.6响应拦截
axios.interceptors.response.use(    //根据你公司后端返回的状态码进行判断。
    response => {   
        // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据     
        // 否则的话抛出错误
        if (response.status === 200) {            
            return Promise.resolve(response);        
        } else {            
            return Promise.reject(response);        
        }    
    },    
    // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码    
    // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
    // 下面列举几个常见的操作,其他需求可自行扩展
    error => {            
        if (error.response.status) {            
            switch (error.response.status) {                
                // 401: 未登录
                // 未登录则跳转登录页面,并携带当前页面的路径
                // 在登录成功后返回当前页面,这一步需要在登录页操作。                
                case 401:                    
                    router.replace({                        
                        path: '/login',                        
                        query: { 
                            redirect: router.currentRoute.fullPath 
                        }
                    });
                    break;

                // 403 token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面                
                case 403:
                     Toast({
                        message: '登录过期,请重新登录',
                        duration: 1000,
                        forbidClick: true
                    });
                    // 清除token
                    localStorage.removeItem('token');
                    store.commit('loginSuccess', null);
                    // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 
                    setTimeout(() => {                        
                        router.replace({                            
                            path: '/login',                            
                            query: { 
                                redirect: router.currentRoute.fullPath 
                            }                        
                        });                    
                    }, 1000);                    
                    break; 

                // 404请求不存在
                case 404:
                    Toast({
                        message: '网络请求不存在',
                        duration: 1500,
                        forbidClick: true
                    });
                    break;
                // 其他错误,直接抛出错误提示
                default:
                    Toast({
                        message: error.response.data.message,
                        duration: 1500,
                        forbidClick: true
                    });
            }
            return Promise.reject(error.response);
        }
    }    
})

最后将axios的方法暴露出去在main.js文件引入。。。

三.api的统一管理

1.将请求接口写在同一个文件中
import axios from './http';

function login() {
    return axios.post('/login');
}

export default {
    login
}

在页面请求接口的时候将文件引入就行了!

2.接口写在同一个文件中,在main.js中引入
import Vue from 'vue';
import App from './App.vue';
import api from './api/http';

Vue.config.productionTip = false;
Vue.prototype.$api = api;

new Vue({
  render: h => h(App),
}).$mount('#app');

在页面使用:

export default {
  methods: {
    add() {
      this.$api.login();
    }
  }
};

大概的就是这样了,具体的还是看公司是怎么要求的!

博客园地址:https://www.cnblogs.com/0314dxj/p/11770120.html
掘金:https://juejin.im/post/5dbaeae8518825644b2b8114

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Axios封装-基础篇 的相关文章

随机推荐

  • vuex中拿不到state中值的问题(state是undefined)

    首先下载vuex然后看一下项目中main文件内有没有引入store文件并且挂载 import Vue from vue import App from App vue import Element from element ui impor
  • IDEA 打包MapReduce程序到集群运行的两种方式以及XShell和Xftp过期的解决

    参考博客 MapReduce打包成jar上传到集群运行 http t csdn cn 2gK1d Xshell7 Xftp7 解决强制更新问题 http t csdn cn rxiBG IDEA打包MapReduce程序 方式一 轻量级打包
  • forkJoin, zip, combineLatest区别

    前言 forkJoin zip combineLatest是rxjs中的合并操作符 用于对多个流进行合并 很多人第一次接触rxjs时往往分不清它们之间的区别 其实这很正常 因为当你准备用来合并的流是那种只会发射一次数据就关闭的流时 比如ht
  • [小技巧] git diff 里显示日文

    先在命令行执行下面的命令 export LANG ja JP UTF 8 然后执行 git diff
  • TensorRT对face_boxes的加速

    TensorRT对face boxes进行加速 难点 priorbox layer和mobileNet SSD中的priorbox layer实现不太一样了 所以要对这层自己进行实现 当前遇到的报错 问题1 nvinfer1 DimsCHW
  • mac word无法显示仿宋字体解决方案

    仿宋是论文写作重要的字体 今天发现好多朋友的macOS系统里的word显示不了仿宋 或者显示不了一些字体 而我的电脑则是时而显示正常 时而显示异常 于是搜了一些解决方案并且自己实测了一下 在应用程序中找到word 右键显示包内容 在Reso
  • CentOS上PHP源码安装和配置

    CentOS上PHP源码安装和配置 此文是在CentOS 7上已经部署了Nginx的基础上进行的 关于CentOS7上安装Nginx 可参考我之前的文章 CentOS上Nginx安装记录 我们现在在这个基础上安装PHP 7 PHP里面概念挺
  • Flink从入门到放弃(十二)-企业实战之事件循环驱动型场景(二)

    上文Flink从入门到放弃 十二 企业实战之事件驱动型场景踩坑 一 为大家介绍了Flink基于事件驱动场景下的渠道流量分析实时需求以及遇到的坑 本文继续讲解基于事件驱动场景来讲解下关于响应时效 服务质量类的需求方案设计以及遇到的坑 关于Fl
  • 为什么有初始化和未初始化段

    初始化段 data 增加elf文件大小 未初始化段 bss 不增加elf文件大小 转载于 https www cnblogs com ShannonSN p 7866481 html
  • ssti模板注入jinja2 之[CSCCTF 2019 Qual]FlaskLight

    知识点 输入 7 7 或者a comment b判断模板类型 返回7777777是一般是jinja2 关于jinja2 的payload 命令执行 for c in class base subclasses if c name catch
  • 20-10-032-安装-KyLin-2.6.1-单机版安装(MAC官网下载)

    文章目录 1 视界 1 官网 2 安装要求 2 1 软件要求 2 2 硬件要求 2 3 Hadoop 环境 3 本次环境 4 HBASE 1 2 0安装 5 kylin 安装 6 检查zk jar 7 启动Hbase 8 添加依赖 9 添加
  • 应届毕业生北京租房经验

    写在前面 个人情况 本人是2021届毕业生 现在在北京西二旗附近打工 一名准打工人 适用范围 如下经验是个人在找房过程中的一些经验供大家参考 找房渠道 优缺点 1 自如 优点 目标用户就是年轻化的一代人 装修风格好 家具什么的也比较美观 该
  • UNI如何使用 plus

    在uni项目钟 使用h5 的puls 可以直接使用uni的 条件编译 就可以直接使用了 ifdef APP PLUS plus nativeUI toast str endif ifndef APP PLUS uni showToast t
  • python numpy 生成矩阵_详解:python numpy矩阵的创建与数据类型!(含实例方法)

    前言 今天为大家带来的内容是 详解 python numpy矩阵的创建与数据类型 含案例方法 本文里面的案例和代码具有不错的参考意义 希望能够在此对各位有所帮助 喜欢的话不忘关注点赞加转发不迷路哦 一 构造矩阵 矩阵的构造可以有多种方法 1
  • QT设置按钮的折叠和展开"

    首先在Qt Creator中拖进一个按钮 将该按钮设置为 显示 按钮 再将其他按钮放置在一个GroupBox中 并将GroupBox中的最后一个按钮设置为 隐藏 按钮 当点击 显示 按钮时 GroupBox显示出来 且 显示按钮被隐藏起来
  • 解决R语言的错误不存在叫‘dplyr’这个名字的程辑包

    运行一个R代码报以上错误 解决方法 在代码最前面加上安装 dplyr 的语句就可以了 install packages dplyr
  • 玩转ChatGPT:AskYourPDF插件尝鲜

    一 写在前面 首先 吐槽一下 感觉被CloseAI耍了 上周发文说这一周对PLUS开放联网和插件功能 搞得网络一片狂欢 但是今天通过身边统计学发现 开通了PLUS后 拥有联网和插件功能的只是少数 而且还是二选一 不少人是没有的 我自己也只有
  • Websocket实现wss协议连接支持语音聊天功能

    部署单页应用 SPA 时 我们通常使用 Nginx 做中间层进行转发代理 为了保护 Web 安全 要求我们使用 HTTPS HTTP SSL 以及 WSS Websocket SSL 进行通信 HTTPS 及 WSS 协议旨在保护用户数据在
  • 基于STM32的大棚温室补光温湿度检测控制proteus仿真

    硬件设计 末尾附文件 仿真图如下所示 程序设计 include stm32f10x h include LQ12864 h include adc h include dth11 h define PUSH UP 1 define PUSH
  • Axios封装-基础篇

    前言 在项目中与后台交互数据这块 通常用的是axios Axios 是一个基于 promise 的 HTTP 库 可以用在浏览器和 node js 中 vue是有自己请求数据的方式 vue resource 把方法抽象出来后 总需要往方法里