微信小程序与axios组成网络层封装过程详解
作者:程序不了猿 发布时间:2024-04-19 10:01:38
背景
小程序在网络层提供的API是能够完成一个程序与服务端交互的完整链路,但需要大量的定制化代码,才能实现请求拦截和响应拦截,不太符合大多数开发者的使用习惯,对于前端开发者来说,网络层还得是axios。
本片主要讲一下小程序网络层使用axios的简要总结,这是一个最精简的一个demo,大家可以在这个基础上去扩充实践。
依赖
这边需要注意的是使用uni-vue3版本时axios的版本需要0.26.0以下,建议锁版本
npm i axios@0.26.0 axios-miniprogram-adapter
&&
yarn add axios@0.26.0 axios-miniprogram-adapter
axios-miniprogram-adapter
这个依赖主要是适配小程序网络请求的适配器,这个适配器的原理大家感兴趣可以去了解一下,简单来说**,axios在发起网络请求时会先判断用户是否定义的适配器,如果定义了那就使用适配器发起网络请求,如果没有定义它会前判断环境,node环境使用http(与服务端一致),浏览器环境使用xhr(高版本可能用fetch,具体是否用大家可以看一下源码)。**所以可以得出一个优先级 adapter >http(node)或xhr(浏览器)。
最简demo
import axios, { AxiosRequestConfig } from 'axios';
import mpAdapter from 'axios-miniprogram-adapter'
import { globalConfig } from '../config';
// base_url
const baseURL = globalConfig.BASE_URL;
// @ts-ignore
// 适配器
axios.defaults.adapter = mpAdapter
// axios初始化实例
const axiosIns = axios.create({
baseURL,
timeout: 10000,
});
// request 请求 * ,处理逻辑
axiosIns.interceptors.request.use(
async (axiosConfig) => {
const config = axiosConfig as any;
config.headers = {
contentType: 'application/json;charset=UTF-8',
};
return config;
},
(error) => {
return Promise.reject(error);
},
);
// response *
axiosIns.interceptors.response.use(
(response) => {
const responData = response.data;
const { rtnFlag } = responData;
// 判断业务是否成功
if (rtnFlag !== '9999') {
// 失败
return Promise.reject(responData);
}
// 成功
return Promise.resolve(responData);
},
(err) => {
return Promise.reject(err);
},
);
export default axiosIns
自定义适配器
如果不用axios-miniprogram-adapter这个依赖,大家也可以如下自定义适配器,这个在uni、微信、支付中可以通用,但注意uni-vue3版本中axios版本需要0.26.0锁死(这个是个人尝试的成功版本,有时间大家可以继续探索)
import axios, { AxiosRequestConfig } from 'axios';
import settle from 'axios/lib/core/settle';
import buildURL from 'axios/lib/helpers/buildURL';
// 自定义适配器适配uniapp语法
axios.defaults.adapter = function (config: any) {
return new Promise((resolve, reject) => {
uni.request({
...config,
method: config.method.toUpperCase(),
header:config.headers,
url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
complete: (response: any) => {
response = {
...response,
config,
};
settle(resolve, reject, response);
},
});
});
};
来源:https://blog.csdn.net/qq_37730829/article/details/128932153


猜你喜欢
- 在机房收费系统中,有几处这样的情况:起始日期和终止日期,相信聪明的你肯定可以想象出为什么要有两个日期控件!是的,就是从一张表中查找出在这两个
- Vue 中使用v-for语句抛出错误的解决方案今天在维护以前的项目的时候遇见了下面的报错情况,开始我以为是因为jQuery和Vue冲突了,所
- 构建运动模糊模型现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不随时间变化。令x0(t)和y0(t)分别代表位移
- 需求背景:用户希望他登录之后,浏览器就帮他记住登录状态,这样他就不用每次进入的时候,都需要登录一次。session过期时间:如果我们没有设置
- 做数据库开发的过程中难免会遇到有表数据备份的,而SELECT INTO……和INSERT INTO SELECT…… 这两种语句就是用来进行
- 一、Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00——框架结构简解&nb
- 前言想要使用摄像头实现一个多人姿态识别环境安装下载并安装 Anaconda官网连接 https://anaconda.cloud/insta
- torch中tensor数据类型转换转换为float32类型:points = points.type(torch.float32)读取to
- 本文实例讲述了JavaScript实现获取select下拉框中第一个值的方法。分享给大家供大家参考,具体如下:1、说明获取select下拉框
- 1. 数据处理中很恶心,出现 RuntimeWarning: divide by zero encountered in divide发现自
- 最近做了一个项目,将从微信下载的音频文件(默认为.amr格式)转化为mp3格式(否则前端播放将会遇到困难)上传到云端。经过一番研究,最终决定
- get方法代码实现# coding:utf-8import jsonfrom urlparse import parse_qsfrom ws
- choice()方法从一个列表,元组或字符串返回一个随机项。语法以下是choice()方法的语法:choice( seq )注意
- 使用pandas处理向量化的数据,进行数据的替换时不仅仅能够进行字符串的替换也能够处理数字。做简单的示例如下:In [4]: data =
- strip_tags定义和用法strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。注释:该函数始终会剥离
- Python 操作 MySQL配置win_64Ubuntu14.04Python3.xpip安装pymysql模块直接使用pip安装 pip
- 表单递交合法性检测-只接受数字。如下代码加入HTML的<head>区:<SCRIPT LANGUAGE=&quo
- 原理 QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头,那么MySQL服务器将尝试对
- 在函数参数中乱用表达式作为默认值Python允许给一个函数的某个参数设置默认值以使该参数成为一个可选参数。尽管这是这门语言很棒的一个功能,但
- 简单的header import urllib2request = urllib2.Request('http://example.