前言 小程序开发,没有vue中的axios那么好使,请求层的封装需要自己来搞。

当然请求层的配置少不了loading,这里索性也就将loading做一个配置,避免以后重复造轮子

请求封装

小程序中有封装好的请求方法:wx.request(url,method,header,success,fail,complete);方法类似于原生的ajax,

这里我们大的方面分两种,一种普通请求,一种是文件上传

普通请求又分为get请求,post请求,post请求又分为JSON格式和BODY格式因此

我们需要大致分为两步

普通请求

封装get请求和post请求为普通请求,我们需要考虑因为其post请求有两种方式所以我们需要将其作为参数来使。

// get/post请求
function fun(url, method, data, header) {
data = data || {};
header = header || {};
wx.showNavigationBarLoading();
let promise = new Promise(function (resolve, reject) {
wx.request({
url: baseUrl + url,
header: header,
data: data,
method: method,
success: function (res) {
if (typeof res.data === "object") {
if (res.data.status) {
if (res.data.status === -200) {
wx.showToast({
title: "为确保能向您提供最准确的服务,请退出应用重新授权",
icon: "none"
});
reject("请重新登录");
} else if (res.data.status === -201) {
wx.showToast({
title: res.data.msg,
icon: "none"
});
setTimeout(function () {
wx.navigateTo({
url: "/pages/user/supplement/supplement"
});
}, 1000);
reject(res.data.msg);
}
}
}
resolve(res.data.result);
},
fail: function (res) {
// fail调用接口失败
reject({ error: '网络错误', code: 0 });
},
complete: function () {
wx.hideNavigationBarLoading();
}
});
});
return promise;
}

文件上传

upload上传和请求方法十分类似,不过不同的是请求是request上传则是upload方法。这里上传采用小程序原生的方法

function upload(url, name, filePath) {
let header = {};
wx.showNavigationBarLoading();
let promise = new Promise(function (resolve, reject) {
wx.uploadFile({
url: baseUrl + url,
filePath: filePath,
name: name,
header: header,
success: function (res) {
resolve(res.data.result);
},
fail: function() {
reject({ error: '网络错误', code: 0 });
},
complete: function () {
wx.hideNavigationBarLoading();
}
});
});
return promise;
}

我们只需要导出以上两种方法即可,不过认真看过的同学会发现baseUrl没有定义啊

这里童鞋们可以根据实际情况,分为开发,测试,生产,生产测试等情况分类,设置baseUr基本域名

这里就不做说明了。

下来我们就是最后一步了,这一步不影响使用。但是为了完美~beautiful

配置loading让交互会更加的友好

配置loading,我们不需要封装loading框,调用小程序自带的就可以,我们只需要操心的是,一个页面很多请求的时候,如何当所有请求完成时再关闭loading?

实现思路:设置一个计数器,因为这里的请求方法都要经过fun,所以说我们只需要在fun调用的时候+1,在返回失败或者成功的时候-1就可以,当等于0的时候调用关闭loading的方法就可以了,笔者简直不要太完美~

// loading配置,请求次数统计
function startLoading() {
wx.showLoading({
title: 'Loading...',
icon: 'none'
})
}
function endLoading() {
wx.hideLoading();
}
// 声明一个对象用于存储请求个数
var needLoadingRequestCount = 0;
function showFullScreenLoading() {
if (needLoadingRequestCount === 0) {
startLoading();
}
needLoadingRequestCount++;
};
function tryHideFullScreenLoading() {
if (needLoadingRequestCount <= 0) return;
needLoadingRequestCount--;
if (needLoadingRequestCount === 0) {
endLoading();
}
};

我们只需要在fun方法中添加showFullScreenLoading(),在返回结果的时候调用tryHideFullScreenLoading()即可实现请求层封装与loading的全局配置~完美不?

源码

下来将源码附上,有帮助的话,记得点个关注呗,待个人网站完善后将会同步至个人网站(百度搜索:狗尾草的前端博客)

const app = getApp()

const baseUrl = app.globalData.baseUrl;

// loading配置,请求次数统计
function startLoading() {
wx.showLoading({
title: 'Loading...',
icon: 'none'
})
}
function endLoading() {
wx.hideLoading();
}
// 声明一个对象用于存储请求个数
var needLoadingRequestCount = 0;
function showFullScreenLoading() {
if (needLoadingRequestCount === 0) {
startLoading();
}
needLoadingRequestCount++;
};
function tryHideFullScreenLoading() {
if (needLoadingRequestCount <= 0) return;
needLoadingRequestCount--;
if (needLoadingRequestCount === 0) {
endLoading();
}
}; // get/post请求
function fun(url, method, data, header) {
data = data || {};
header = header || {};
wx.showNavigationBarLoading();
showFullScreenLoading();
let promise = new Promise(function (resolve, reject) {
wx.request({
url: baseUrl + url,
header: header,
data: data,
method: method,
success: function (res) {
if (typeof res.data === "object") {
if (res.data.status) {
if (res.data.status === -200) {
wx.showToast({
title: "为确保能向您提供最准确的服务,请退出应用重新授权",
icon: "none"
});
reject("请重新登录");
} else if (res.data.status === -201) {
wx.showToast({
title: res.data.msg,
icon: "none"
});
setTimeout(function () {
wx.navigateTo({
url: "/pages/user/supplement/supplement"
});
}, 1000);
reject(res.data.msg);
}
}
}
resolve(res.data.result);
tryHideFullScreenLoading();
},
fail: function (res) {
// fail调用接口失败
reject({ error: '网络错误', code: 0 });
tryHideFullScreenLoading();
},
complete: function () {
wx.hideNavigationBarLoading();
}
});
});
return promise;
} // 上传
function upload(url, name, filePath) {
let header = {};
wx.showNavigationBarLoading();
showFullScreenLoading();
let promise = new Promise(function (resolve, reject) {
wx.uploadFile({
url: baseUrl + url,
filePath: filePath,
name: name,
header: header,
success: function (res) {
resolve(res.data.result);
tryHideFullScreenLoading();
},
fail: function() {
reject({ error: '网络错误', code: 0 });
tryHideFullScreenLoading();
},
complete: function () {
wx.hideNavigationBarLoading();
wx.hideLoading();
}
});
});
return promise;
} module.exports = {
"get": function (url, data, header) {
return fun(url, "GET", data, header);
},
"post": function (url, data, header) {
return fun(url, "POST", data, header);
},
upload: function (url, name, filePath) {
return upload(url, name, filePath);
}
};

使用说明,需要在调用方法的时候传入header,为json格式的还是body格式,总结不易,你的关注是我更新的吃鸡动力~

小程序api请求层封装(Loading全局配置)的更多相关文章

  1. 微信小程序request请求的封装

    目录 1,前言 2,实现思路 3,实现过程 3.1,request的封装 3.2,api的封装 4,实际使用 1,前言 在开发微信小程序的过程中,避免不了和服务端请求数据,微信小程序给我们提供了wx. ...

  2. 基于promise对小程序http请求方法封装

    原因是我不想每次请求都复制粘贴那么长的请求地址,所以我把前边那一坨请求地址作为基础地址,只传后台给的路由就ok,而且,并不是每次请求都要显示正在加载,这对小程序体验很差,所以,我加了个形参,用来判断是 ...

  3. 小程序api的promise封装

    微信小程序和支付宝小程序的api封装方法是一样的,都是外部新建一个js,使用module.exports导出,要注意的是,最好使用post请求,虽然get请求没什么不好,主要是好修改.这里使用的MD5 ...

  4. 微信小程序 之 请求函数封装

    封装的request的代码 /** * @desc API请求接口类封装 */ /** * POST请求API * @param {String} url 接口地址 * @param {Object} ...

  5. 小程序-API请求

    Page({ onLoad:function(){ // 在onLoad中调用发送请求的函数 this.getProList(); } getProList:function(){ var self= ...

  6. mpvue学习笔记-之微信小程序数据请求封装

    简介 美团出品的mpvue已经开源出来很久了,一直说要进行一次实践,这不最近一次个人小程序开发就用上了它. 看了微信官方的数据请求模块--request,对比了下get和post请求的代码,发现如果在 ...

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

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

  8. 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理

    前言: 小程序开发中诸如获取用户手机号码.调起微信支付.领取卡券等api都是会有一定的延迟的.也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一 ...

  9. 微信小程序(二)--逻辑层与界面层

    一.逻辑层与界面层分离 小程序开发框架将我们需要完成的编码,划分成了两种类型的编码:逻辑编码(由JavaScript完成,业务数据供给界面事件处理),界面编码(页面结构WXML,页面样式WXSS,展示 ...

随机推荐

  1. Blue_Flke团队项目设计完善&编码测试

    任务1:文档<软件设计方案说明书>github地址:https://github.com/13993013291/ruanjianguigexuqiu 任务2:项目集成开发环境:eclip ...

  2. Python -- Json 数据编码及解析

    Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...

  3. Java 包的概述和讲解

    2017-11-02 22:58:45 包(package):其实就是文件夹. 包的作用是对类进行分类的管理,并且区分不同的类名. 举例: 学生:增加,删除,修改,查询 教师:增加,删除,修改,查询 ...

  4. C#复制文件

    string pLocalFilePath ="";//要复制的文件路径 string pSaveFilePath ="";//指定存储的路径 if (File ...

  5. 探索Bioconductor数据包

    参考: R的bioconductor包TxDb.Hsapiens.UCSC.hg19.knownGene详解 Bioconductor的数据包library(org.Hs.eg.db)简介

  6. English trip -- Review Unit 10 Leisure 休闲

    Words dance exercise fish play basketball play cards swim cook play the guitar listen to music watch ...

  7. 20170728xlVBA改转置一例

    Sub 导出() Dim Sht As Worksheet, ShtName As String Dim NextRow As Long, NextRow2 As Long Dim iRow As L ...

  8. Android之ToolBar和自定义ToolBar实现沉浸式状态栏

    沉浸式状态栏确切的说应该叫做透明状态栏.一般情况下,状态栏的底色都为黑色,而沉浸式状态栏则是把状态栏设置为透明或者半透明. 沉浸式状态栏是从android Kitkat(Android 4.4)开始出 ...

  9. ccf第二题总结

    1.游戏 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加, ...

  10. hpu1165 贪心

    1165: 最少的需求 [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 12 解决: 4 状态 题目描述 小Q开了一家餐厅,最近生意非常火爆. 假设有N N 个预订信息,第i i ...