前言:

微信小程序开发中,后端提供了接口设计文档,前端可以先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请求的更多相关文章

  1. 微信小程序开发调试阶段不校验请求域名

    在微信小程序开发官网上有说明: 在开发者工具的右上角有详情选项,可以勾选不校验合法域名,之后就可以与本地ip进行通信了!

  2. 微信小程序开发 [05] wx.request发送请求和妹纸图

    1.wx.request 微信小程序中用于发起网络请求的API就是wx.request了,具体的参数太多,此处就不再一一详举了,基本使用示例如下: wx.request({ url: 'test.ph ...

  3. 微信小程序开发——使用promise封装异步请求

    前言: 有在学vue的网友问如何封装网络请求,这里以正在写的小程序为例,做一个小程序的请求封装. 关于小程序发起 HTTPS 网络请求的Api,详情可以参考官方文档:wx.request(Object ...

  4. WordPress版微信小程序开发系列(一):WordPress REST API

    自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决.不过这些文章 ...

  5. 微信小程序开发系列六:微信框架API的调用

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  6. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  7. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  8. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  9. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

随机推荐

  1. 继承LinearLayout自定义左侧菜单

    public class LeftMenuView extends LinearLayout { LinkedHashMap<Integer,String> map=new LinkedH ...

  2. Spring事件通知机制

    在上图中,调用 getApplicationEventMulticaster()方法,该方法返回的ApplicationEventMulticaster类型的对象applicationEventMul ...

  3. 在线学习在CTR上应用的综述

    参考:https://mp.weixin.qq.com/s/p10_OVVmlcc1dGHNsYMQwA 在线学习只是一个机器学习的范式(paradigm),并不局限于特定的问题,模型或者算法. 架构 ...

  4. org.apache.catalina.LifecycleException项目启动报错

    严重: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalin ...

  5. 图表相同数据会自动合并问题(finereport)

    finereport中,对于图表的操作,当遇到需要显示多个重复分类下的多个值时,由于自动合并相同数据,无法达到效果反复查询手册无果后,困扰好久,终想到了一个解决的办法:1.给查询的数据添加个列序号,每 ...

  6. 五、Python-字典与集合

    字典是一系列键-值对,每个键都与一个值想关联,可以用键来访问与之关联的值,与键相关联的值可以是数字.字符串.列表乃至字典(Python可以将任何对象作为字典中的值),Python中,字典用“{}”表示 ...

  7. 实战ELK(8) 安装ElasticSearch中文分词器

    安装 方法1 - download pre-build package from here: https://github.com/medcl/elasticsearch-analysis-ik/re ...

  8. Tools:实现ping操作带时间戳【windows+linux】

    [windows下]: ping.vbs Dim args, flag, unsuccOut args="" otherout="" flag= If WScr ...

  9. py库:os、shutil、pathlib

    https://www.cnblogs.com/MnCu8261/p/5494807.html shutil模块 http://blog.csdn.net/rozol/article/details/ ...

  10. mybatis学习 -每天一记 mybatis insert null 报错

    mybatis 插入数据,model的属性存在null,插入报错 在使用mybatis 进行insert时,如果字段值存在null的情况,会出现插入失败的情况,解决方案: 如果使用spring boo ...