axios封装

一、axios是什么特性基本使用二、为什么要封装三、如何封装设置接口请求前缀设置请求头与超时时间封装请求方法请求拦截器响应拦截器小结

一、axios是什么

axios 是一个轻量的 HTTP客户端

基于 XMLHttpRequest 服务来执行 HTTP 请求,支持丰富的配置,支持 Promise,支持浏览器端和 Node.js 端。自Vue2.0起,尤大宣布取消对 vue-resource 的官方推荐,转而推荐 axios。现在 axios 已经成为大部分 Vue 开发者的首选

特性

  • 从浏览器中创建 XMLHttpRequests

  • node.js 创建 http请求

  • 支持 Promise API

  • 拦截请求和响应

  • 转换请求数据和响应数据

  • 取消请求

  • 自动转换JSON 数据

  • 客户端支持防御XSRF

基本使用

安装

1// 项目中安装
2npm install axios --S
3// cdn 引入
4<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

导入

1import axios from 'axios'

发送请求

1axios({        
2  url:'xxx',    // 设置请求的地址
3  method:"GET", // 设置请求方法
4  params:{      // get请求使用params进行参数凭借,如果是post请求用data
5    type: '',
6    page: 1
7  }
8}).then(res => {  
9  // res为后端返回的数据
10  console.log(res);   
11})

并发请求axios.all([])

1function getUserAccount() {
2    return axios.get('/user/12345');
3}
4
5function getUserPermissions() {
6    return axios.get('/user/12345/permissions');
7}
8
9axios.all([getUserAccount(), getUserPermissions()])
10    .then(axios.spread(function (res1, res2) { 
11    // res1第一个请求的返回的内容,res2第二个请求返回的内容
12    // 两个请求都执行完成才会执行
13}));

二、为什么要封装

axios 的 API 很友好,你完全可以很轻松地在项目中直接使用。

不过随着项目规模增大,如果每发起一次HTTP请求,就要把这些比如设置超时时间、设置请求头、根据项目环境判断使用哪个请求地址、错误处理等等操作,都需要写一遍

这种重复劳动不仅浪费时间,而且让代码变得冗余不堪,难以维护。为了提高我们的代码质量,我们应该在项目中二次封装一下 axios 再使用

举个例子:

1axios('http://localhost:3000/data', {
2  // 配置代码
3  method: 'GET',
4  timeout: 1000,
5  withCredentials: true,
6  headers: {
7    'Content-Type': 'application/json',
8    Authorization: 'xxx',
9  },
10  transformRequest: [function (data, headers) {
11    return data;
12  }],
13  // 其他请求配置...
14})
15.then((data) => {
16  // todo: 真正业务逻辑代码
17  console.log(data);
18}, (err) => {
19  // 错误处理代码  
20  if (err.response.status === 401) {
21  // handle authorization error
22  }
23  if (err.response.status === 403) {
24  // handle server forbidden error
25  }
26  // 其他错误处理.....
27  console.log(err);
28});

如果每个页面都发送类似的请求,都要写一堆的配置与错误处理,就显得过于繁琐了

这时候我们就需要对axios进行二次封装,让使用更为便利

三、如何封装

封装的同时,你需要和 后端协商好一些约定,请求头,状态码,请求超时时间.......

设置接口请求前缀:根据开发、测试、生产环境的不同,前缀需要加以区分

请求头 : 来实现一些具体的业务,必须携带一些参数才可以请求(例如:会员业务)

状态码: 根据接口返回的不同status , 来执行不同的业务,这块需要和后端约定好

请求方法:根据getpost等方法进行一个再次封装,使用起来更为方便

请求拦截器: 根据请求的请求头设定,来决定哪些请求可以访问

响应拦截器: 这块就是根据 后端`返回来的状态码判定执行不同业务

设置接口请求前缀

利用node环境变量来作判断,用来区分开发、测试、生产环境

1if (process.env.NODE_ENV === 'development') {
2  axios.defaults.baseURL = 'http://dev.xxx.com'
3} else if (process.env.NODE_ENV === 'production') {
4  axios.defaults.baseURL = 'http://prod.xxx.com'
5}

在本地调试的时候,还需要在vue.config.js文件中配置devServer实现代理转发,从而实现跨域

1devServer: {
2    proxy: {
3      '/proxyApi': {
4        target: 'http://dev.xxx.com',
5        changeOrigin: true,
6        pathRewrite: {
7          '/proxyApi': ''
8        }
9      }
10    }
11  }

设置请求头与超时时间

大部分情况下,请求头都是固定的,只有少部分情况下,会需要一些特殊的请求头,这里将普适性的请求头作为基础配置。当需要特殊请求头时,将特殊请求头作为参数传入,覆盖基础配置

1const service = axios.create({
2    ...
3    timeout: 30000,  // 请求 30s 超时
4     headers: {
5        get: {
6          'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
7          // 在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来
8        },
9        post: {
10          'Content-Type': 'application/json;charset=utf-8'
11          // 在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来
12        }
13  },
14})

封装请求方法

先引入封装好的方法,在要调用的接口重新封装成一个方法暴露出去

1// get 请求
2export function httpGet({
3  url,
4  params = {}
5}) {
6  return new Promise((resolve, reject) => {
7    axios.get(url, {
8      params
9    }).then((res) => {
10      resolve(res.data)
11    }).catch(err => {
12      reject(err)
13    })
14  })
15}
16
17// post
18// post请求
19export function httpPost({
20  url,
21  data = {},
22  params = {}
23}) {
24  return new Promise((resolve, reject) => {
25    axios({
26      url,
27      method: 'post',
28      transformRequest: [function (data) {
29        let ret = ''
30        for (let it in data) {
31          ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
32        }
33        return ret
34      }],
35      // 发送的数据
36      data,
37      // url参数
38      params
39
40    }).then(res => {
41      resolve(res.data)
42    })
43  })
44}

把封装的方法放在一个api.js文件中

1import { httpGet, httpPost } from './http'
2export const getorglist = (params = {}) => httpGet({ url: 'apps/api/org/list', params })

页面中就能直接调用

1// .vue
2import { getorglist } from '@/assets/js/api'
3
4getorglist({ id: 200 }).then(res => {
5  console.log(res)
6})

这样可以把api统一管理起来,以后维护修改只需要在api.js文件操作即可

请求拦截器

请求拦截器可以在每个请求里加上token,做了统一处理后维护起来也方便

1// 请求拦截器
2axios.interceptors.request.use(
3  config => {
4    // 每次发送请求之前判断是否存在token
5    // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况,此处token一般是用户完成登录后储存到localstorage里的
6    token && (config.headers.Authorization = token)
7    return config
8  },
9  error => {
10    return Promise.error(error)
11  })

响应拦截器

响应拦截器可以在接收到响应后先做一层操作,如根据状态码判断登录状态、授权

1// 响应拦截器
2axios.interceptors.response.use(response => {
3  // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
4  // 否则的话抛出错误
5  if (response.status === 200) {
6    if (response.data.code === 511) {
7      // 未授权调取授权接口
8    } else if (response.data.code === 510) {
9      // 未登录跳转登录页
10    } else {
11      return Promise.resolve(response)
12    }
13  } else {
14    return Promise.reject(response)
15  }
16}, error => {
17  // 我们可以在这里对异常状态作统一处理
18  if (error.response.status) {
19    // 处理请求失败的情况
20    // 对不同返回码对相应处理
21    return Promise.reject(error.response)
22  }
23})

小结

  • 封装是编程中很有意义的手段,简单的axios封装,就可以让我们可以领略到它的魅力

  • 封装 axios 没有一个绝对的标准,只要你的封装可以满足你的项目需求,并且用起来方便,那就是一个好的封装方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell和go实现:防火墙放行所有端口,唯独拦截80端口

shell 1.防火墙放行所有端口&#xff0c;唯独拦截80端口 1.1拦截 mkdir -p /data/shellscat > /data/shells/02nginx_close.sh <<-EOF #!/bin/bash# 检查Linux系统版本 linux_version$(cat /etc/redhat-release)# 根据Linux系统版本选择相应的防火墙开启命令和保存…

python入门介绍

目录 内存 外存&#xff08;硬盘等&#xff09;区别 显卡&#xff1a; python的优缺点 内存 外存&#xff08;硬盘等&#xff09;区别 内存的存储空间小&#xff0c;外存的存储空间大内存的访问速度快&#xff0c;外存的访问速度慢内存比外存成本更高内存上的数据容易丢失&…

MongoDB - writeConcern

writeConcern 是 MongoDB 提供的一个功能&#xff0c;用于控制写操作的确认级别&#xff0c;以确保数据的持久性和一致性。在分布式环境中&#xff0c;写入操作可能会面临网络延迟、节点故障等情况&#xff0c;writeConcern 允许您指定在写入数据时所需的确认级别&#xff0c;以…

ZTE E8820V2重启偶现5G wifi丢失问题

使用ZTE E8820V2设备时,发现设备在多次重启过程中会出现5G wifi信号丢失的情况。 1. 现象日志 使用老毛子固件,具体丢失时会出现相关log: 2. 问题原因: GPIO#19 是 PCIE reset 外,GPIO#26 也要 reset。 3. 解决方法: E8820V2/rt-n56u/trunk$ git diff linux-3.4.x…

Aethir推出其首次去中心化AI节点售卖

Aethir&#xff0c;去中心化GPU云基础设施领导者&#xff0c;宣布其备受期待的节点销售。Aethir是一家企业级的以AI和游戏为重点的GPU即服务提供商。Aethir的去中心化云计算基础设施使GPU提供商能够与需要NVIDIA的H100芯片提供强大AI/ML任务支持的企业客户相连接。 此外&#x…

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4 题目描述&#xff1a;Click to launch instance. 开题&#xff1a; 点击链接&#xff0c;有点像SSRF 使用local_file://协议读到本地文件&#xff0c;无法使用file://协议读取&#xff0c;有过滤。 local_file://协议&#xff1a; local_file…

JavaWeb 自己给服务器安装SQL Server数据库遇到的坑

之前买的虚拟主机免费送了一个SQL Server数据库&#xff0c;由于服务器提供商今年下架我用的那款虚拟主机产品&#xff0c;所以数据库也被收回了。我买了阿里云云服务器&#xff0c;但是没有数据库&#xff0c;于是自己装了一个SQL Server数据库&#xff0c;总结一下遇到的坑。…

小程序画布(二维地图线)

首先开始是想用小程序兼容openlayers的&#xff0c;但是了解到用不了&#xff0c;那就用画布来解决 实际效果如下 wxml中代码 <canvas id"trackDesignCanvas" //指定 id 的 Canvas 组件class"orbit-canvas-main" type"2d" …

安卓平板主板_安卓平板电脑主板MTK联发科|高通|紫光展锐方案

安卓平板电脑主板选择了MTK联发科方案&#xff0c;并且可以选配高通或者紫光展锐平台方案&#xff0c;为用户提供更强劲的性能和定制化的服务。主板搭载了联发科MT6771处理器&#xff0c;采用12nm制程工艺&#xff0c;拥有八核Cortex-A73Coretex-A53架构&#xff0c;主频为2.0G…

Nest.js权限管理系统开发(七)用户注册

创建user模块 先用nest的命令创建一个 user 模块&#xff0c; nest g res user 实现user实体 然后就生成了 user 模块,在它的实体中创建一个用户表user.entity.ts&#xff0c;包含 id、用户名、密码,头像、邮箱等等一些字段&#xff1a; Entity(sys_user) export class Us…

【底层学习】HashMap源码学习

成员变量 // 默认初始容量 就是16 static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // aka 16// 最大容量 static final int MAXIMUM_CAPACITY 1 << 30;// 默认加载因子0.75 static final float DEFAULT_LOAD_FACTOR 0.75f;// 树化阈值&#xff08;链表转为…

IT廉连看——C语言——结构体

IT廉连看——C语言——结构体 一、结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag {member-list; }variable-list; 例如描述一个学生&#xff1a;typedef struct Stu…

SQL Server添加用户登录

我们可以模拟一下让这个数据库可以给其它人使用 1、在计算机中添加一个新用户TeacherWang 2、在Sql Server中添加该计算机用户的登录权限 exec sp_grantlogin LAPTOP-61GDB2Q7\TeacherWang -- 之后这个计算机用户也可以登录数据库了 3、添加数据库的登录用户和密码&#xff0…

进程与线程之线程

首先exec函数族是进程中的常用函数&#xff0c;可以利用另外的进程空间执行不同的程序&#xff0c;在之前的fork创建子进程中会完全复制代码数据段等&#xff0c;而exec函数族则可以实现子进程实现不同的代码 int execl(const char *path, const char *arg, ... …

Qt之字符串查找

去掉空格 OString类的成员雨数 trimmed&#xff08;&#xff09;会去掉字符申首尾的空格&#xff0c;而成员函数simplified&#xff08;&#xff09;不仅 去掉宇符申首尾的空格&#xff0c;中间连续的空格也用一个空格符来替换。比如&#xff1a; OString str1"Are you O…

C++拿几道题练练手吧

第 1 题 【 问答题 】 • 最短路径问题 平面上有n个点(n<100)&#xff0c;每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的直线距离。现在的任务…

远超 IVF_FLAT、HNSW,ScaNN 索引算法赢在哪?

Faiss 实现的 ScaNN&#xff0c;又名 FastScan&#xff0c;它使用更小的 PQ 编码和相应的指令集&#xff0c;可以更为友好地访问 CPU 寄存器&#xff0c;展示出优秀的索引性能。 Milvus 从 2.3 版本开始&#xff0c;在 Knowhere 中支持了 ScaNN 算法&#xff0c;在各项 benchma…

JavaAPI常用类03

目录 java.lang.Math Math类 代码 运行 Random类 代码 运行 Date类/Calendar类/ SimpleDateFormat类 Date类 代码 运行 Calendar类 代码 运行 SimpleDateFormat类 代码一 运行 常用的转换符 代码二 运行 java.math BigInteger 代码 运行 BigDecimal …

VS项目忽略文件.gitignore模板

Visual Studio项目忽略文件.gitignore模板 ## 忽略Visual Studio临时文件、生成结果和 ## 由流行的Visual Studio加载项生成的文件。 ## ## 从获取最新消息 https://github.com/github/gitignore/blob/main/VisualStudio.gitignore# 用户特定文件 *.rsuser *.suo *.user *.user…

数字孪生的技术开发平台

数字孪生的开发平台可以基于各种软件和硬件工具来实现&#xff0c;这些平台提供了丰富的功能和工具&#xff0c;帮助开发人员构建、部署和管理数字孪生系统&#xff0c;根据具体的需求和技术要求&#xff0c;开发人员可以选择合适的平台进行开发工作。以下列举了一些常见的数字…