当前位置:   article > 正文

微信小程序开发--网络请求封装_微信小程序网络请求封装

微信小程序网络请求封装

1、背景

在做微信小程序开发的时候难免会涉及到网络请求操作,小程序提供的原生网络请求的api如下所示:

  1. wx.request({
  2. url: 'https://test.com/******', //仅为示例,并非真实的接口地址
  3. data: {
  4. x: '',
  5. y: ''
  6. },
  7. header: {
  8. 'content-type': 'application/json' // 默认值
  9. },
  10. success (res) {
  11. console.log(res.data)
  12. }
  13. })

其中 url: 为请求的后台接口地址;

        data: 为请求接口需要携带的参数;

        header:设置请求的 header,content-type 默认为 application/json,

        success: 为请求成功后的回调,res包含请求成功后返回的数据。

更多关于 wx.request的用法可以查看官方介绍。

RequestTask | 微信开放文档

那既然官方已经提供有api,为什么还需要进行二次封装呢?

2、二次封装的原因

第一点、避免重复代码

避免重复代码主要体现在以下几点:

1) 我们公司调用后台接口,除了登录接口外,其它的接口请求都需要在请求头中加入token,如果不做封装的情况下,每次调用网络请求都需要传token,很麻烦。

2)在网络请求的时候往往需要给个加载框,提示用户正在加载.... 如下图所示:

        

如果不做封装,在每个网络请求的地方如果需要弹出加载框,都需要重复写这一段代码:

请求开始的时候,显示加载框。

 请求结束的时候,隐藏加载框:

第二点、避免回调地狱

一个页面如果有多个网络请求,并且请求有一定的顺序,wx.request 是异步操作,那么最直接的结果就如下所示代码:

  1. onLoad: function () {
  2. wx.request({
  3. url: 'https://test.com/api/test01',
  4. success:res=>{
  5. wx.request({
  6. url: 'https://test.com/api/test02',
  7. success: res=>{
  8. wx.request({
  9. url: 'https://test.com/api/test03',
  10. success: res=>{
  11. testDataList: res.content
  12. }
  13. })
  14. }
  15. })
  16. }
  17. })
  18. },

是不是很像俄罗斯套娃。

为了避免这种写法,当然进行封装了,在这个地方采用了Promise。

关于Prolise的介绍可以到廖雪峰的官方网站去查看,有详细的介绍。

Promise - 廖雪峰的官方网站研究互联网产品和技术,提供原创中文精品教程icon-default.png?t=L9C2https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

3、具体的封装实现

工程结构:

 在utils文件夹下新建了两个文件。

1) httpUtils.js

网络请求的封装,具体代码如下:

  1. const ui = require('./ui');
  2. const BASE_URL = 'https://www.wanandroid.com'
  3. /**
  4. * 网络请求request
  5. * obj.data 请求接口需要传递的数据
  6. * obj.showLoading 控制是否显示加载Loading 默认为false不显示
  7. * obj.contentType 默认为 application/json
  8. * obj.method 请求的方法 默认为GET
  9. * obj.url 请求的接口路径
  10. * obj.message 加载数据提示语
  11. */
  12. function request(obj) {
  13. return new Promise(function(resolve, reject) {
  14. if(obj.showLoading){
  15. ui.showLoading(obj.message? obj.message : '加载中...');
  16. }
  17. var data = {};
  18. if(obj.data) {
  19. data = obj.data;
  20. }
  21. var contentType = 'application/json';
  22. if(obj.contentType){
  23. contentType = obj.contentType;
  24. }
  25. var method = 'GET';
  26. if(obj.method){
  27. method = obj.method;
  28. }
  29. wx.request({
  30. url: BASE_URL + obj.url,
  31. data: data,
  32. method: method,
  33. //添加请求头
  34. header: {
  35. 'Content-Type': contentType ,
  36. 'token': wx.getStorageSync('token') //获取保存的token
  37. },
  38. //请求成功
  39. success: function(res) {
  40. console.log('===============================================================================================')
  41. console.log('== 接口地址:' + obj.url);
  42. console.log('== 接口参数:' + JSON.stringify(data));
  43. console.log('== 请求类型:' + method);
  44. console.log("== 接口状态:" + res.statusCode);
  45. console.log("== 接口数据:" + JSON.stringify(res.data));
  46. console.log('===============================================================================================')
  47. if (res.statusCode == 200) {
  48. resolve(res);
  49. } else if (res.statusCode == 401) {//授权失效
  50. reject("登录已过期");
  51. jumpToLogin();//跳转到登录页
  52. } else {
  53. //请求失败
  54. reject("请求失败:" + res.statusCode)
  55. }
  56. },
  57. fail: function(err) {
  58. //服务器连接异常
  59. console.log('===============================================================================================')
  60. console.log('== 接口地址:' + url)
  61. console.log('== 接口参数:' + JSON.stringify(data))
  62. console.log('== 请求类型:' + method)
  63. console.log("== 服务器连接异常")
  64. console.log('===============================================================================================')
  65. reject("服务器连接异常,请检查网络再试");
  66. },
  67. complete: function() {
  68. ui.hideLoading();
  69. }
  70. })
  71. });
  72. }
  73. //跳转到登录页
  74. function jumpToLogin(){
  75. wx.reLaunch({
  76. url: '/pages/login/login',
  77. })
  78. }
  79. module.exports = {
  80. request,
  81. }

代码中有详细的注释,在这里就不多做解释了。

2) ui.js

主要是对wx UI操作的一些简单封装,代码如下:

  1. export const showToast = function(content,duration) {
  2. if(!duration) duration = 2000
  3. wx.showToast({
  4. title: content,
  5. icon: 'none',
  6. duration: duration,
  7. })
  8. }
  9. var isShowLoading = false
  10. export const showLoading = function(title) {
  11. if(isShowLoading) return
  12. wx.showLoading({
  13. title: title?title:'',
  14. mask:true,
  15. success:()=>{
  16. isShowLoading = true
  17. }
  18. })
  19. }
  20. export const hideLoading = function() {
  21. if(!isShowLoading) return
  22. isShowLoading = false
  23. wx.hideLoading()
  24. }

3) 具体调用

在index.js 进行了网络请求,具体代码如下:

  1. // index.js
  2. const httpUtils = require('../../utils/httpUtils')
  3. const ui = require('../../utils/ui')
  4. Page({
  5. data: {
  6. str:null,
  7. },
  8. onLoad() {
  9. },
  10. //获取接口数据
  11. getNetInfo(){
  12. let obj = {
  13. method: "POST",
  14. showLoading: true,
  15. url:`/user/register?username=pppooo11&password=pppooo&repassword=pppooo`,
  16. message:"正在注册..."
  17. }
  18. httpUtils.request(obj).then(res=>{
  19. this.setData({
  20. str:JSON.stringify(res)
  21. })
  22. ui.showToast(res.data.errorMsg)
  23. }).catch(err=>{
  24. console.log('ERROR')
  25. });
  26. }
  27. })

好了,到这里也就结束了,如果上面的内容对你有所帮助不要忘记点个赞哟。

代码已经上传到了github上面,感兴趣的可以点击下载。

GitHub - YMAndroid/NetWorkDemoicon-default.png?t=L9C2https://github.com/YMAndroid/NetWorkDemo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/677630
推荐阅读
相关标签
  

闽ICP备14008679号