微信小程序开发——使用mock数据模拟api请求
前言:
微信小程序开发中,后端提供了接口设计文档,前端可以先mock数据模拟api请求进行开发调试,而且可以根据需要设计mock文件的格式和内容,这样在后端接口开发完成之前,前端可以最大限度的完成前端的开发。
编写mock数据文件:
//mocklist.js
export default {
//获取openid(所有登录方式都需要有)
getOpenId: {
s: "0",
m: "登录成功",
uid: "666",
d: {
openid: 'ds3fs5f1sd3s5d1f3sdf153'
}
},
//检验登录有效性
checkToken: {
s: "0",
m: "登录成功",
uid: "666",
d: {
usertoken: 'wefsdik8888888888888888888'
}
},
......
为了方便接口请求的异常处理,mock数据中最好带有接口请求结果的状态字段,这样在前期页面制作、业务逻辑编码的时候就能把所有情况都进行考虑编码,这比等待后端提供接口或者临时编写demo数据要方便省事的多。
封装网络请求:
//request.js
//接口访问异常统一错误提示
const errorToast = function(msg) {
wx.showToast({
title: msg || "服务器繁忙,请稍后再试",
icon: "none"
})
} //接口列表(如果接口较多,可以单独提取到一个js文件中)
const apiList = {
/*登录相关*/
checkToken: 'user/checkToken', //检查token是否有效
getSmsCode: 'user/authcode', //获取验证码
userLogin: 'user/login', //登录
......
} /**
* 封装http 请求方法
*/
const apiUrl ="https://xxx.xxxx.cn/"
const http = (params) => {
wx.loading()
//返回promise 对象
return new Promise((resolve, reject) => {
wx.request({
url: apiUrl + params.url,
data: params.data,
header: params.header || {
"Content-Type": "application/x-www-form-urlencoded",
"usertoken": wx.getStorageSync("usertoken"),
"uid":(new Date()).getTime()+'_'+Math.floor(Math.random()*100000000)//接口请求流水号
},
method: params.method || 'POST',
success: function(res) {
wx.hideLoading()
var data = res.data;
if (res.statusCode == 200 && data) {
//需要登录、后端返回登录失效代码,需要自动登录然后重新加载小程序
if (!params.noNeedLogin && data.s == 302) {
wx.removeStorageSync("usertoken")
wx.removeStorageSync("openid")
wx.toast('登陆失效,请重新登陆~', () => {
//登陆失效,跳转到登陆页面
wx.reLaunch({
url: '../../pages/login/index',
})
})
return;
}
//判断是否需要预处理错误信息
if (params.noPreError) {
//接口需要单独处理错误信息,直接返回响应信息
resolve(data)
} else {
if (data.s == "0") {
resolve(data.d)
} else {
errorToast(data.m)
console.log(data)
}
}
} else {
errorToast();
console.log(data)
}
},
fail: function(e) {
errorToast();
reject(e)
}
})
})
} /**
* 封装mock数据模拟接口请求
*/
import {
mocklist
} from '../mocklist.js'
const http2 = (params) => {
return new Promise((resolve, reject) => {
wx.loading()
setTimeout(() => {
for (var key in apiList) {
if (apiList[key] == params.url) {
wx.hideLoading()
var data = mocklist[key]
//需要登录、后端返回登录失效代码,需要自动登录然后重新加载小程序
if (!params.noNeedLogin && data.s == 302) {
wx.toast('登陆失效,请重新登陆~', () => {
//登陆失效,跳转到登陆页面
wx.reLaunch({
url: '../../pages/login/index',
})
})
return;
}
//判断是否需要预处理错误信息
if (params.noPreError) {
//接口需要单独处理错误信息,直接返回响应信息
resolve(data)
} else {
if (data.s == "0") {
resolve(data.d)
} else {
wx.toast(data.m || "系统繁忙,请稍后重试~")
console.log(data)
}
}
break;
}
}
}, 500)
})
}
module.exports = {
errorToast,
apiList,
http:http//http2
}
说明:
1.接口路径 apiList 如果比较多,可以单独抽取到一个js中;
2.响应数据预处理:响应数据默认进行预处理,给与统一返回响应值和异常提示;特殊接口根据noPreError、noNeedLogin进行特殊处理(后文会详细说明);
3.对于统一返回的数据是用 data 还是 data.d ,则要考虑正常情况下无需返回数据的情况(如对手机号进行验证,只需要返回正确的响应状态和提示信息,无需返回数据,即data.d为空),对大部分接口直接返回data.d的好处是页面中编写接口请求可以不需要再对data.s进行判断,直接对返回的data(也就是data.d)进行判断就好了,如果无需返回数据的接口请求比较少,则直接使用noPreError进行特殊处理就可以了;
4.分别封装了真实请求(http)和mock请求(http2),而切换也很容易。
//使用mock开发
module.exports = {
http:http2
}
//后端真实接口联调
module.exports = {
http:http
}
对具体接口请求进行封装:
import {
errorToast,
apiList,
http
} from 'request.js'
/**
* 导出接口请求
* noNeedLogin: true 无需登录
* noPreError: true 无需预处理错误信息
*/
module.exports = {
errorToast,
//检验用户登录有效性
checkToken(channelid) {
return http({
url: apiList.checkToken,
data: {
channelid: channelid
},
noPreError: true, //无需预处理错误信息
noNeedLogin: true //无需登录
})
},
//获取短信验证码
getSmsCode(phone) {
return http({
url: apiList.getSmsCode,
data: {
phone: phone
},
noNeedLogin: true
})
},
......
}
如上,接口请求封装配置了接口的地址、参数以及两个特殊参数:
noPreError:(无需预处理)参数对响应结果进行特殊处理的(特殊异常提示,跳转等)的接口请求进行标志;
noNeedLogin:无需登陆参数,仅针对无需登陆就能访问的接口进行配置。
微信小程序开发——使用mock数据模拟api请求的更多相关文章
- 微信小程序开发调试阶段不校验请求域名
在微信小程序开发官网上有说明: 在开发者工具的右上角有详情选项,可以勾选不校验合法域名,之后就可以与本地ip进行通信了!
- 微信小程序开发 [05] wx.request发送请求和妹纸图
1.wx.request 微信小程序中用于发起网络请求的API就是wx.request了,具体的参数太多,此处就不再一一详举了,基本使用示例如下: wx.request({ url: 'test.ph ...
- 微信小程序开发——使用promise封装异步请求
前言: 有在学vue的网友问如何封装网络请求,这里以正在写的小程序为例,做一个小程序的请求封装. 关于小程序发起 HTTPS 网络请求的Api,详情可以参考官方文档:wx.request(Object ...
- WordPress版微信小程序开发系列(一):WordPress REST API
自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决.不过这些文章 ...
- 微信小程序开发系列六:微信框架API的调用
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 微信小程序开发心得
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...
- 微信小程序开发日记——高仿知乎日报(下)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
随机推荐
- 20175236 2018-2019-2 《Java程序设计》第六周学习总结
教材学习内容总结 第七章 try :用于监听.将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出. catch:用于捕获异常.catch用来捕获try ...
- mybatis的缓存简说
一级缓存(不需配置,默认为一级缓存): 1)相当于 sqlsession 级别的缓存 2)当 session 关闭(close)或者提交(commit)后,缓存数据清空 3)当发生insert.upd ...
- [UE4]Spline
Spline和Spline Mesh的区别: 1.Spline Mesh是有实体表现的,Spline Mesh可以拉伸弯曲实体模型,Spline Mesh是具象. 2.Spline 只有曲线,没有实体 ...
- 关于Unity单个对象多个脚本的Update调用的时序问题
先说几句废话, 最近在研究Unity, 这玩意用起来比较简单, 而且商店里还有各种插件, 初学者也能轻松拼凑出一个像模像样的游戏(顺便说一句,自己做着玩就无所谓了,但随便拼凑个辣鸡丢出来骗钱就不好了) ...
- vs2015 iis express启动不了及安装DotNetCore.1.0.0-VS2015Tools.Preview2失败的解决方法
直接用管理员账户打开cmd,进入exe所在的文件夹在运行命令DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1不要加引号. PS:如果 ...
- org.apache.catalina.LifecycleException项目启动报错
严重: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalin ...
- Windows根证书的批量导出和导入
# POWERSHELL批量导出 Get-ChildItem -Path Cert:\LocalMachine\Root\ |ForEach-Object {Export-Certificate -C ...
- sqoop 问题以及 小tips
1. Sqoop import 任务里把原来NULL的转化成字符串‘null’了. 解决方法: 先: alter table ${table_name} SET SERDEPROPERTIES('se ...
- 服务器上运行程序Out of memory 解决办法
****** 服务器上跑过程序经常能遇到out of memory 这个问题,下面是我经常在实验室碰到的解决方法. 1.使用命令nvidia-smi,看到GPU显存被占满: 2.尝试使用 ps aux ...
- spring命名空间
作为一名入门级菜鸟的我,在刚开始学spring框架的时候,对于命名空间不是很理解,只是在跟着老师敲代码.随着后来学习的深入,慢慢了解到命名空间的意义.如果你没有引入相应的命名空间,就不能引用相应的标签 ...