1,前言
在开发微信小程序的过程中,避免不了和服务端请求数据,微信小程序给我们提供了wx.request 这个API,调用方法如下
wx.request({
url: 'www.baidu.com',
data: {
x: '',
y: ''
},
header: {
'content-type': 'application/json'
},
success (res) {
console.log(res.data)
}
});
复制代码
作为一个合格的前端开发,为了代码质量和优雅度(其实是因为懒 ),避免不了封装一些重复代码和功能,来使开发过程更加酣畅淋漓。
2,实现思路
项目中,wx.request 的很多参数都是固定的,只需要改变data 的值,而一般我们的逻辑处理都是在wx.request 的回调success ,fail 和complete 中操作的,并且有部分逻辑也是相同的,(比如判断接口返回数据是否成功,根据成功或失败显示不同的提示框等等),所以博主在这边用了Promise 来做了一个链式调用封装,少去了大部分重复语句。
3,实现过程
首先我们需要创建一个公共的requestFn.js 文件,在这个文件中写我们的wx.request 的封装,然后还需要创建一个公共的Api.js 文件,这个里面存放我们的接口地址和自定义的function ,最后,在微信小程序根目录下的app.js 中找到globalData ,在里面写上项目常用的请求域名,具体的如下图。
目录结构

app.js
 3.1,request的封装
在requestFn.js 中,我们要做到的是创建一个function ,在里面统一处理wx.request 需要的参数和返回值,还有请求过程中的Loading 提示,Toast 提示,然后通过module.exports 将这个function 暴露出去,完整代码如下。
const app = getApp();
const baseURL = app.globalData.baseURL;
const FN = require('../publicFn/public');
const Request = (options) =>{
return new Promise((resolve, reject) => {
FN.Loading(1);
wx.request({
url: baseURL + options.url || '',
data: options.data || {},
method: options.method || 'POST',
header:{'content-type': "application/x-www-form-urlencoded"},
responseType:options.responseType || "",
timeout:15000,
success (res) {
FN.LoadingOff();
if(res.statusCode === 200){
if(res.data.status === "y"){
resolve(res.data);
}else{
FN.Toast(res.data.info);
};
}else{
FN.Toast(res.errMsg);
};
},
fail (res) {
FN.Toast("网络开小差了");
reject(res);
}
})
})
};
module.exports = {
Request
};
复制代码
3.2,api的封装
request 已经封装好了,下面就是将项目需要的请求接口,还有各个模块的数据请求方法定义一下,统一放在api.js 中,方便维护(ps:如果你的模块非常多,可以按模块建立不同的api.js ,按需引入)。

详细代码如下
const requestFn = require('../requestFn/requestFn');
const API = {
banner:"/web/getBanner.am",
};
const HTTP = {
banner(userId, appClientTypeCode){
return requestFn.Request({
url:API.banner,
data:{
userId:userId,
appClientTypeCode:appClientTypeCode,
}
})
},
}
module.exports = HTTP;
复制代码
4,实际使用
在这几个步骤之后,我们的一个request 的封装就完成了,接下来就是实际应用了,调用方法如下。
1,在我们的页面对应的js 文件头部先要引入我们对应的api.js 。
import HTTP from "../../requestFn/Api";
复制代码
2,在Page 对象中定义方法
getBanner () {
let userId = null;
if(app.globalData.userMsg !== null && app.globalData.userMsg.userId) userId = app.globalData.userMsg.userId;
let system = app.globalData.systemInfo.system;
let type = "DICT_APP_CLIENT_TYPE_CODE_IOS";
if(system){
if(!~system.indexOf("iOS")) type = "DICT_APP_CLIENT_TYPE_CODE_ANDROID";
};
HTTP.banner(userId, type)
.then(res => {
this.setData({
bannerList:res.infoObject
});
});
}
复制代码
以上就是全部内容,如有写的不对的,欢迎指出。 作者:鹏多多 链接:https://juejin.cn/post/6918983173770575880 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |