小程序开发(3)-之wx.request封装

#主要的封装是wxRequest、wxRequestGet、wxRequestPost、wxRequestPromise、headers这几个函数,由于太过赘余不进行截图展示,可以看utils.js

#wxRequest方法

wxRequest其实跟原始的wx.request没有太大的不同,相当于一个中间键,可以更灵活的配置,可维护性更高,一致请求,首先来解析一些wxRequest,以下简介的说明下

 

获取本地存储的token(ssoAuthToken),如果token存在就设置header,直接请求接口,不存在就重新刷新token之后,再请求该接口

 

isLoading是用来判断某些接口是否需要wx.showLoading(加载中),就可能我不是所有的接口都需要loading的提示,只是部分请求时长比较久的接口需要,所以我们存了一个需要loading的数组,判断请求的接口url是否存在这个数组中,存在就显示loading,而这个数组的数据都是从api.js里面拿出来的,如图一所示,我们每个API都是以对象的方式存的,为什么这样做呢,主要是想灵活点,例如我可能需要调不同的服务器的接口,那么我就可以配置多一个baseUrl的字段,调接口就传多一个baseUrl,如果没有传就使用默认的服务器域名

 

always方法其实是相当于请求失败的一个拦截器,请求失败后做什么事情

#wxRequestPromise方法

是加入Promise的一个操作,方便我们做链式调用,最后执行resolve或reject方法,返回一个Promise对象,供我们使用.then

#演示不同的请求方法代码片段

#util.wxRequest util.wxRequest({ url: api.queryServiceAreaByName.url, data: queryServiceAreaByName, method: 'POST', success: function (res) { console.log(res); } })

#util.wxRequest
util.wxRequest({url: api.queryServiceAreaByName.url,data: queryServiceAreaByName,method: 'POST',success: function (res) {console.log(res);}})
#util.wxRequestPost
util.wxRequestPost({url: api.getEvaluateList.url,data,}).then(res => res.data.data).then(data => {console.log('data', data);})

#util.wxRequestPost util.wxRequestPost({ url: api.getEvaluateList.url, data, }) .then(res => res.data.data) .then(data => { console.log('data', data); })

#图一

const config = require('../config/config.js');
const dayjs = require("./dayjs");
const api = require("./api.js");
const app = getApp();const loadingApi = [api.queryServiceAreaInPoint.url,api.queryConstructionInPoint.url,api.queryServiceAreaByName.url,api.queryServiceAreaWithPoint.url,api.getUserDetails.url,api.addEvaluateItem.url,api.queryServiceAreaDetailInMap.url,api.queryOrderByPhone.url
];const formatTime = date => {const year = date.getFullYear()const month = date.getMonth() + 1const day = date.getDate()const hour = date.getHours()const minute = date.getMinutes()const second = date.getSeconds()return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}const formatNumber = n => {n = n.toString()return n[1] ? n : '0' + n
}function headers(header) {header = header || {};//小应用特殊头header['X-Requested-isWXAPP'] = 'YES';//session_id , vmc_uid 处理var session_id = wx.getStorageSync('_SID'),vmc_uid = wx.getStorageSync('_VMC_UID');var ownshop = wx.getStorageSync('own_shop');// SIDif (session_id)header['X-WxappStorage-SID'] = session_id;if (ownshop) {header['X-REQUESTED-HEADER-VSHOPID'] = ownshop;}// UIDif (vmc_uid)header['X-WxappStorage-VMC-UID'] = vmc_uid;if (wx.getStorageSync('merchant_id')) {header['X-WxappStorage-MCH-ID'] = wx.getStorageSync('merchant_id');}if (config.RUN_ON_SAAS && wx.getExtConfig) {var ext_vars = wx.getExtConfigSync();// SAAS RUN TYPEheader['x-requested-saas-mode'] = 'APP';header['x-requested-saas-app'] = ext_vars.host_pre;header['x-requested-saas-client'] = ext_vars.client_id;header['x-requested-saas-order'] = ext_vars.order_id;}return header;
}function wxRequest(params) {let ssoAuthToken = wx.getStorageSync('sso_auth_token') || null;let isLoading = loadingApi.includes(params.url);if (!params.header) {params.header = {};}// loading加载if (isLoading) {wx.showLoading({title: '加载中',})}// 如果没有baseUrl使用config上配置的,如果有使用传入的if (!params.baseUrl) {params.url = config.BASE_URL + params.url;} else {params.url = params.baseUrl + params.url;}headers(params.header);//content-typeparams.header['content-type'] = params.header['content-type'] ? params.header['content-type'] : 'application/json';if (ssoAuthToken) {params.header['accessToken'] = ssoAuthToken.accessToken;params.header['refreshToken'] = ssoAuthToken.refreshToken;let serviceAreaIds = ssoAuthToken.serviceAreas.map(item => item.id);if (params.data.serviceAreaIdList) {params.header['serviceAreaIds'] = params.data.serviceAreaIdList[0];} else {params.header['serviceAreaIds'] = serviceAreaIds[0];}}// 拿到接口数据后进行处理,相当于拦截器var always = function (res) {console.log('util.js:always')if (res.data && !res.data.success) {var res_redirect = res.data.redirect;if (res_redirect && res_redirect.match && res_redirect.match(/passport-login/i)) {//服务端登录状态丢失,重新登录delete (app.globalData.member);return checkMember(function () {wx.showModal({title: '已刷新用户登录状态',content: '请重新进入',showCancel: false,success: function (res) {wx.navigateBack();}});});}}};if (params.success) {var _tmp = params.success;params.success = null;params.success = function (res) {always(res);_tmp(res);if (isLoading) {// setTimeout(function () {wx.hideLoading();// }, 1000)}};} else {params.success = function (res) {always(res);};}// 获取ssoAuthToken,如果ssoAuthToken里的accessToken、refreshToken过期了,刷新后再请求接口  if (ssoAuthToken) {let timestamp = dayjs(new Date()).valueOf();if (ssoAuthToken.expiresIn < timestamp) {// 这里过期的时候可能执行多次,因为一个页面可能调了多个接口,可以做500ms的队列if (app && app.globalData) {app.globalData.loginModal.getTokenByRefreshToken(params);}} else {wx.request(params);}} else {wx.request(params);}
}// promise 封装 wxRequest
const wxRequestPromise = (method) =>(params) => new Promise((resolve, reject) => {if (!params.url) throw 'params url not found'params.method = methodparamsFn(params, 'success', resolve)paramsFn(params, 'fail', reject)console.log('params', params);wxRequest(params)})const paramsFn = (params, fnName, cb) => {const fn = params[fnName] || (() => { })params[fnName] = nullparams[fnName] = (res) => {fn(res)cb(res)}
}function wxUpload(params) {if (!params.header) {params.header = {};}headers(params.header);//content-typeparams.header['content-type'] = 'multipart/form-data';wx.uploadFile(params);
}
const checkMemberHook = function (page_ins, page_callback_fn) {let the_member = app.globalData.member;try {page_ins.setData({'member': the_member,});} catch (e) {//TODO}typeof page_callback_fn == 'function' && page_callback_fn(the_member);
}function checkMember(callback, is_retry) {var _this = this;clearTimeout(app.getMemberTimer);app.getMemberTimer = setTimeout(function () {console.log('begin getMember at ' + new Date());app.getMember(function (member) {if (member.member_id) {return checkMemberHook(_this, callback);}wxRequest({url: config.BASE_URL + '/openapi/toauth/callback/wechat_toauth_wxapppam/callback',method: 'POST',data: member,success: function (res) {if (!res.data.result || res.data.result != 'success') {console.info('oauth server callback res error:');console.info(res);wx.showModal({title: '授权失败',content: res.data.data || '',showCancel: (!is_retry),confirmText: (!is_retry ? '重试' : '确定'),success: function (res) {if (!is_retry && res.confirm) {checkMember.apply(_this, [callback, true]);}}});} else {// app.globalData.member.member_id = res.data.data.member_id;// app.globalData.member.openid = res.data.data.openid;Object.assign(app.globalData.member, res.data.data);checkMemberHook(_this, callback);}},complete: function () {}});});}, 0);
}function formatArea(area_str = '') {var match = area_str.match(/mainland:([^:]+)/);if (match) {return match[1].split('/').join('-');}
}function fix_img_url(url) {if (url.match(/^http([s]*):/)) {return url;}return 'https:' + url;
}//倒计时
function count_down(that, intDiff) {function cd() {var day = 0,hour = 0,minute = 0,second = 0; //时间默认值if (intDiff > 0) {day = Math.floor(intDiff / (60 * 60 * 24)).toString();hour = (Math.floor(intDiff / (60 * 60)) - (day * 24)).toString();minute = (Math.floor(intDiff / 60) - (day * 24 * 60) - (hour * 60)).toString();second = (Math.floor(intDiff) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)).toString();}if (day <= 9)day = '0' + day;if (hour <= 9)hour = '0' + hour;if (minute <= 9)minute = '0' + minute;if (second <= 9)second = '0' + second;if (day == 0 && hour == 0 && minute == 0 && second == 0) {clearInterval(cd);}that.setData({countdown: {days: day,hours: hour,minutes: minute,seconds: second,}});intDiff -= 1;}setInterval(cd, 1000)
};function scene_parse(scene) {if (scene) {try {var scene_obj = JSON.parse(decodeURIComponent(scene));} catch (e) {return false;}if (typeof scene_obj == 'object') {return scene_obj;}return false;}return false;
}/*获取当前页带参数的url*/
function getCurrentPageUrlWithArgs() {var pages = getCurrentPages() //获取加载的页面var currentPage = pages[pages.length - 1] //获取当前页面的对象var url = currentPage.route //当前页面urlvar options = currentPage.options //如果要获取url中所带的参数可以查看options//拼接url的参数var urlWithArgs = url + '?'for (var key in options) {var value = options[key]urlWithArgs += key + '=' + value + '&'}urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)return urlWithArgs
}function gotoIndex() {wx.switchTab({url: "/pages/index/index"});
}function merchantShare(url) {let merchant_id;if (wx.getStorageSync('merchant_id')) {merchant_id = wx.getStorageSync('merchant_id');} else {merchant_id = 0;}if (url.indexOf("?") != -1) {url += '&merchant_id=' + merchant_id} else {url += '?merchant_id=' + merchant_id}return url;
}function getQuery(url, query) {if (url.indexOf('?') < 0)return;var arr = url.split('?');var query_arr = arr[1].split('&');for (var i = 0; i < query_arr.length; i++) {let single_arr = query_arr[i].split('=');console.log('single_arr', single_arr);if (!single_arr[1]) continue;query[single_arr[0]] = single_arr[1];}return query;
}function setTabBarBadge() {wxRequest({url: config.BASE_URL + '/openapi/cart/count',success: function (res) {try {if (res.data.data.quantity > 0) {wx.setTabBarBadge({index: 1,text: res.data.data.quantity.toString(),success: function () {},fail: function () {},complete: function (e) {}})} else {wx.removeTabBarBadge({index: 1,success: function () {},fail: function () {},complete: function (e) {}})}} catch (e) {console.log(e)}}});
}// 过滤显示服务区的拥有服务图标
function filterServiceProvidedIcon(params) {if (!params) {return []}var IconObj = {//餐饮 coffeeActivecatering: 'coffeeActive',//住宿 oilActiveaccommodation: 'oilActive',//购物 shoppingActiveshopping: 'shoppingActive',//卫生间 toiletActivetoilet: 'toiletActive',//停车场 parkparking_lot: 'park',//加油站 gasfuel_filling: 'gas',//充电桩 chargerecharge: 'charge',//加气站 naturalGasair_entrapping: 'naturalGas',//维修 maintainmaintenance: 'maintain',//其他服务 more}var originIcon = params.split(',')var fileterIcon = originIcon.map(element => IconObj[element])return fileterIcon.filter(ele => ele)
}function setHtmlSnip(keyword, text) {return '<div>' + text.replace(new RegExp(keyword, 'g'), `<span style="color: blue">${keyword}</span>`) + '</div>'
}const wxRequestGet = wxRequestPromise('GET')
const wxRequestPost = wxRequestPromise('POST')function getUserInfo() {return new Promise((resolve, reject) => {const wxUserInfo = wx.getStorageSync('wx_userinfo') || {}if (wxUserInfo.nickName) {resolve(wxUserInfo)} else {wx.getUserInfo({success: (result) => {wx.setStorage({data: { ...wxUserInfo, ...result.userInfo },key: 'wx_userinfo',})resolve(result.userInfo)},complete: () => resolve({}),})}})
}const buriedPoint = async (data = {}) => {const { scene } = wx.getLaunchOptionsSync()const wxUserInfo = await getUserInfo()// console.log('wxUserInfo', wxUserInfo);data = {...data,buriedPointType: data.path ? 0 : 1,type: Number(scene !== 1001),nickName: wxUserInfo.nickName || '',phoneNumber: wxUserInfo.phoneNumber || '',}console.log('buriedPoint', data);return wxRequestPost({url: api.buriedPoint.url,data,})
}const checkLogin = () => new Promise((resolve, reject) => {const app = getApp()if (app.globalData.checkLogin) {resolve()} else {const cb = app.checkLoginReadyCallbackapp.checkLoginReadyCallback = () => {typeof cb === 'function' && cb()resolve()};}
})const getTime= function(value, flag) {let theTime = parseInt(value);// 秒let middle= 0;// 分let hour= 0;// 小时let result = ""if(theTime > 60) {middle= parseInt(theTime/60);theTime = parseInt(theTime%60);if(middle> 60) {hour= parseInt(middle/60);middle= parseInt(middle%60);}if(flag) {result = ""+parseInt(theTime)+"秒"}} else {result = ""+parseInt(theTime)+"秒"}if(middle > 0) {result = ""+parseInt(middle)+"分钟"+result;}if(hour> 0) {result = ""+parseInt(hour)+"小时"+result;}return result;
}function enclosureJHpay(params) {var _this = this;let userInfo = wx.getStorageSync('wx_userinfo');return wxRequestPost({url: api.enclosureJHpay.url,data: {...params,appId: config.APPID,openId: userInfo.openId}}).then(res => {let payParams = res.data.data;return new Promise((resolve, reject) => {console.log(res)wx.requestPayment({timeStamp: payParams.timeStamp,nonceStr: payParams.nonceStr,package: payParams.mypackage,signType: payParams.signType,paySign: payParams.paySign,success: function (res) {console.log(res);resolve(res);},fail: function (err) {console.log(err);reject(err)}})})})
}function getQueryString(urlStr) {let urlParams = {};let str = urlStr.substr(urlStr.indexOf("?")+1); //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串let strs = str.split("&");for (let i = 0; i < strs.length; i++) {let sTemp = strs[i].split("=");urlParams[sTemp[0]]=(sTemp[1]);}return urlParams
}module.exports = {formatTime: formatTime,headers: headers,wxRequest: wxRequest,wxUpload: wxUpload,checkMember: checkMember,formatArea: formatArea,fixImgUrl: fix_img_url,countdown: count_down,sceneParse: scene_parse,getCurrentPageUrlWithArgs: getCurrentPageUrlWithArgs,gotoIndex: gotoIndex,merchantShare: merchantShare,getQuery: getQuery,setTabBarBadge: setTabBarBadge,filterServiceProvidedIcon: filterServiceProvidedIcon,wxRequestGet,wxRequestPost,buriedPoint,checkLogin,getUserInfo,setHtmlSnip: setHtmlSnip,getTime: getTime,enclosureJHpay: enclosureJHpay,getQueryString: getQueryString
}

 

 

 

 

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

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

相关文章

elasticsearch-head 谷歌插件以及安装和使用说明

文章目录一、谷歌插件方式1. 下载2. 扩展程序3. 打开开发者模式4. 拖动插件5. 添加扩展程序6. 点击es插件7. 连接8.效果对比二、源码运行方式(推荐使用)2.1. 克隆源码2.2. 配置2.3. 下载依赖2.4. 启动2.5. 验证一、谷歌插件方式 1. 下载 https://github.com/mobz/elasticsear…

闲鱼如何高效承接并处理用户纠纷

背景 闲鱼是一个基于C2C场景的闲置交易平台&#xff0c;每个用户既是买家也是卖家&#xff0c;在自由享受交易乐趣的同时也容易带来一些问题&#xff0c;如发一些侵权违规商品而不自知&#xff0c;发一些带情绪化言语对他人照成了伤害等,因此这也带来了一个核心问题&#xff1…

国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?

作者 | 马超责编 | 王晓曼封图 | CSDN 付费下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近日&#xff0c;中国电子书厂商Oynx拒绝开源其基于Linux 内核修改的设备源码&#xff0c;这一做法违反了Linux的GPL协议&#xff0c;在Reddit社区引发了开源…

系统重构的道与术

最近参与了很多重构项目&#xff0c;有以提高服务器资源利用率为目标的Gateway网关、AMAPS等服务的重构&#xff0c;也有以提升架构合理性和研发效率为目标的共享业务服务化拆分&#xff0c;借此机会把相关内容梳理一下&#xff0c;是分享更是自我总结和学习。准备以重构工作中…

小程序开发(4)-之登录

#为了获取token&#xff0c;所以需要搞个模拟登陆&#xff0c;用一个特定的账号&#xff0c;对密码进行md5加密&#xff0c;也只是在app.js那里进行一次调用&#xff0c;这里主要是说一下globalData.checkLogin、checkLoginReadyCallback&#xff0c;这时this指向的是全局的app…

SpringBoot2 整合 AXIS2 服务端和客户端

文章目录一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码.一、AXIS2服务端 1. 版本选型 阿健/框架版本spring-boot2.5.5axis21.7.9 2…

阿里风控大脑关于大数据应用的探索与实践

以下内容根据演讲视频以及PPT整理而成。本次分享主要围绕以下三个方面&#xff1a; 一、阿里风控大脑整体介绍二、近线引擎三、离线引擎一、阿里风控大脑整体介绍1. 阿里风控大脑是什么? 阿里的风控主要分为两大块。一块是金融领域&#xff0c;主要业务是支付宝&#xff0c;另…

我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!

今年还有什么比股市更赚钱的技能&#xff1f;那就是正处于 IT 风口的人工智能所需的 Python 。我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Pyth…

idea创建springmvc项目

文章目录1. 创建项目2.配置3. 加载tomcat4. 完成5. 启动项目6. 效果图7. 修改访问路径1. 创建项目 2.配置 3. 加载tomcat 4. 完成 5. 启动项目 6. 效果图 7. 修改访问路径

Java工程师该如何编写高效代码?

阿里妹导读&#xff1a;世界上只有两种物质&#xff1a;高效率和低效率&#xff1b;世界上只有两种人&#xff1a;高效率的人和低效率的人。——萧伯纳 同理&#xff0c;世界上只有两种代码&#xff1a;高效代码和低效代码&#xff1b;世界上只有两种人&#xff1a;编写高效代码…

Terraform Module 可视化正式发布

可视化操作界面 12月12日&#xff0c;阿里云开放平台正式对外推出 Terraform Module 的可视化操作界面&#xff1a;https://api.aliyun.com/#/cli?toolTerraform&#xff0c;集合所有在 Terraform Registry 上注册过的 Module&#xff0c;对外提供在线运行 Terraform Module …

“编程能力差的程序员,90%输在这事上!”谷歌AI专家:都是瞎努力!

Google 人工智能开发者专家彭靖田老师说——超90%的程序员在初学Python 人工智能时&#xff0c;都会遇到下面3个问题&#xff1a;1.想学人工智能&#xff0c;但不知从何学起&#xff0c;也不知道该选择什么方向...2.Python语法、机器学习/深度学习框架、算法都能看懂&#xff0…

小程序开发(6)-之自定义导航栏

#如图一所示&#xff0c;我们在导航栏中加了个文案和搜索框第一步我们需要在app.json->window设置&#xff0c;还可配置更多的选项 &#xff1a; {"navigationStyle": "custom","backgroundTextStyle": "light","navigationB…

ClickHouse深度揭秘

引言 ClickHouse是近年来备受关注的开源列式数据库&#xff0c;主要用于数据分析&#xff08;OLAP&#xff09;领域。目前国内社区火热&#xff0c;各个大厂纷纷跟进大规模使用&#xff1a; 今日头条 内部用ClickHouse来做用户行为分析&#xff0c;内部一共几千个ClickHouse节…

国货在崛起,八成都做对了这件事

来了&#xff01;阿里巴巴年度最大的商业大会&#xff0c;第二届ONE商业大会。 此次ONE大会上&#xff0c;国货品牌的崛起成为所有人瞩目的焦点&#xff1a;8成知名服饰企业已同阿里云手拉手&#xff0c;收入平均增速24%&#xff01; 阿里云智能总裁张建锋&#xff08;中&…

nacos 集成 zipkin sleuth实现链路追踪(入门篇)

声明&#xff1a;链路追踪属于微服务的一部分&#xff0c;微服务系列博文陆续会出&#xff0c;可以帮助小伙伴们学习微服务一站式从入门到精通。 文章目录一、zipkin 服务端1. 下载2. 前台运行3. 服务端访问二、网关服务2.1. 父项目依赖2.2. gateway依赖2.3. gateway配置三、订…

开源巨头 SUSE 收购 Rancher Labs,云原生时代来临

作者 | 马超责编 | 伍杏玲封图 | rancher.com官网出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近日&#xff0c;全球最大的独立开源公司SUSE宣布收购云原生初始公司Rancher Labs。针对此交易&#xff0c;SUSE首席执行官Melissa Di Donato表示&#xff1a;“我们…

小程序开发(8)-之跳转第三方小程序设计

嗯嗯&#xff0c;这个其实没什么好说&#xff0c;但还是说说我们项目的做法&#xff0c;因为我们这里需要跳转的小程序挺多的&#xff0c;所以我们采用了在后台配置的&#xff0c;像图一一样&#xff0c;配置名称、appid、跳转的页面地址等 wx.navigateToMiniProgram({appId: …

使用函数计算三步实现深度学习 AI 推理在线服务

目前深度学习应用广发&#xff0c; 其中 AI 推理的在线服务是其中一个重要的可落地的应用场景。本文将为大家介绍使用函数计算部署深度学习 AI 推理的最佳实践, 其中包括使用 FUN 工具一键部署安装第三方依赖、一键部署、本地调试以及压测评估&#xff0c; 全方位展现函数计算…

仅用 2 年过渡到自研 ARM 芯片,苹果的底气从何而来?

作者 | Steven Sinofsky译者 | 弯月&#xff0c;责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;今年 WWDC 2020 上&#xff0c;苹果宣布自研 ARM 芯片——Apple Silicon&#xff0c;对于苹果而言&#xff0c;Apple Silicon很…