微信小程序开发--网络请求封装_微信小程序网络请求封装-程序员宅基地

技术标签: 网络  微信小程序  小程序  

1、背景

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

wx.request({
  url: 'https://test.com/******', //仅为示例,并非真实的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默认值
  },
  success (res) {
    console.log(res.data)
  }
})

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

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

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

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

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

RequestTask | 微信开放文档

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

2、二次封装的原因

第一点、避免重复代码

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

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

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

        

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

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

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

第二点、避免回调地狱

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

onLoad: function () {
    wx.request({
      url: 'https://test.com/api/test01',
      success:res=>{
        wx.request({
          url: 'https://test.com/api/test02',
          success: res=>{
            wx.request({
              url: 'https://test.com/api/test03',
              success: res=>{
                testDataList: res.content
              }
            })
          }
        })
      }
    })
  },

是不是很像俄罗斯套娃。

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

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

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

3、具体的封装实现

工程结构:

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

1) httpUtils.js

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

const ui = require('./ui');
const BASE_URL = 'https://www.wanandroid.com'


/**
 * 网络请求request
 * obj.data 请求接口需要传递的数据
 * obj.showLoading 控制是否显示加载Loading 默认为false不显示
 * obj.contentType 默认为 application/json
 * obj.method 请求的方法  默认为GET
 * obj.url 请求的接口路径 
 * obj.message 加载数据提示语
 */
function request(obj) {
    return new Promise(function(resolve, reject) {
      if(obj.showLoading){
        ui.showLoading(obj.message? obj.message : '加载中...');
      }
      var data = {};
      if(obj.data) {
        data = obj.data;
      }
      var contentType = 'application/json';
      if(obj.contentType){
        contentType = obj.contentType;
      } 
  
      var method = 'GET';
      if(obj.method){
        method = obj.method;
      }
  
      wx.request({
        url: BASE_URL + obj.url,
        data: data,
        method: method,
        //添加请求头
        header: {
          'Content-Type': contentType ,
          'token': wx.getStorageSync('token') //获取保存的token
        },
        //请求成功
        success: function(res) {
          console.log('===============================================================================================')
          console.log('==    接口地址:' + obj.url);
          console.log('==    接口参数:' + JSON.stringify(data));
          console.log('==    请求类型:' + method);
          console.log("==    接口状态:" + res.statusCode);
          console.log("==    接口数据:" + JSON.stringify(res.data));
          console.log('===============================================================================================')
          if (res.statusCode == 200) {
            resolve(res);
          } else if (res.statusCode == 401) {//授权失效
            reject("登录已过期");
            jumpToLogin();//跳转到登录页
          } else {
            //请求失败
            reject("请求失败:" + res.statusCode)
          }
        },
        fail: function(err) {
          //服务器连接异常
          console.log('===============================================================================================')
          console.log('==    接口地址:' + url)
          console.log('==    接口参数:' + JSON.stringify(data))
          console.log('==    请求类型:' + method)
          console.log("==    服务器连接异常")
          console.log('===============================================================================================')
          reject("服务器连接异常,请检查网络再试");
        },
        complete: function() {
          ui.hideLoading();
        }
      })
    });
  }
  

  //跳转到登录页
  function jumpToLogin(){
    wx.reLaunch({
      url: '/pages/login/login',
    })
  }
  
  module.exports = {
    request,
  }
  

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

2) ui.js

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

export const showToast = function(content,duration) {
    if(!duration) duration = 2000
    wx.showToast({
        title: content,
        icon: 'none',
        duration: duration,
    })
  }
  
  var isShowLoading = false
  export const showLoading = function(title) {
    if(isShowLoading) return
    wx.showLoading({
        title: title?title:'',
        mask:true,
        success:()=>{
            isShowLoading = true
        }
    })
  }
  
  export const hideLoading = function() {
    if(!isShowLoading) return
    isShowLoading = false
    wx.hideLoading()
  }

3) 具体调用

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

// index.js
const httpUtils = require('../../utils/httpUtils')
const ui = require('../../utils/ui')

Page({
  data: {
    str:null,
  },

  onLoad() {
  },

  //获取接口数据
  getNetInfo(){
    let obj = {
      method: "POST",
      showLoading: true,
      url:`/user/register?username=pppooo11&password=pppooo&repassword=pppooo`,
      message:"正在注册..."
    }
    httpUtils.request(obj).then(res=>{
      this.setData({
        str:JSON.stringify(res)
      })
      ui.showToast(res.data.errorMsg)
    }).catch(err=>{
      console.log('ERROR')
    });
  }
})

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010892109/article/details/118575074

智能推荐

HTML5标准学习 - 编码-程序员宅基地

文章浏览阅读60次。HTML5标准学习 - 编码 from:http://www.cnblogs.com/GrayZhang/archive/2011/04/11/learning-html5-charset.html相信每一个前端工程师都或多或少遇上过“乱码”这位仁兄,无论你的基...

AB压测工具的介绍及安装-程序员宅基地

文章浏览阅读1.9k次。今天我要和大家聊聊AB压测工具,如果你对网站性能测试感兴趣或有需要,那么这篇文章一定会帮到你。我曾经也因为缺少良好的压力测试工具而苦恼,直到我发现了AB压测工具。它可以帮助我们测试网站在高并发情况下的性能表现,让我们更好地了解网站的性能瓶颈和优化方向。接下来,我将为大家介绍AB压测工具的安装和使用方法,希望能够帮助大家更好地进行网站性能测试,提升网站的质量和用户体验。_ab压测工具

使用URL启动android默认浏览器,启动指定浏览器_scheme打开系统自带浏览器-程序员宅基地

文章浏览阅读847次。打开URL启动android默认浏览器,启动指定浏览器 分类: android2015-05-07 09:2718人阅读评论(0)收藏举报浏览器uri原文出自:http://blog.csdn.net/u013812046/article/details/39226515一、启动android默认浏览器  Intent intent _scheme打开系统自带浏览器

计算机网络学习建议_计算机网络课程设计的建议-程序员宅基地

文章浏览阅读863次,点赞2次,收藏2次。计算机网络+计算机网络课程设计这门课挺有意思,是真的有意思,知道一个网络具体是怎么运作,然后还能自己动手配置一个网络,观察一个数据包的流转过程,不过学校的课程不是那么全面,讲得不是那么浅显易懂,学完只是懂了一些老古董。除此之外,课程安排确实让人吐槽,连上四节课,一般上到第三节课就已经熄火了,听不进去。关于课程设计安排更是有问题,思科学院的东西,如此现代,如此浅显易懂,居然让我们用课设时间去看,最关键的是,课设只有四天,你要看完一本书,这是不切实际的,完完全全地浪费了那么好的课程,所以不建议的那么安排。_计算机网络课程设计的建议

第三章--第二篇--开放式对话系统_开放式对话不支持多轮-程序员宅基地

文章浏览阅读545次。概念:开放式对话系统是指一种可以与用户进行自由对话的系统,用户可以提出任意话题的问题或发表意见,而系统能够理解用户的输入并做出相应的回应。与任务导向的对话系统不同,开放式对话系统更注重与用户的自由互动,旨在模拟人类的对话能力和语言交流。目标:开放式对话系统的目标是实现自然、流畅、有趣的对话体验,使用户感到与真实人类对话类似。自然性:系统能够理解用户的语言表达,包括词汇、语法、语义等,并以自然、流畅的方式进行回应,使用户感到在与真人交谈。_开放式对话不支持多轮

个人网站制作源代码_个人网站源码-程序员宅基地

文章浏览阅读9.2k次。/ 01 /前话《周末·听雨》包含动态雨滴效果,采用Dreamweaver软件制作,代码结构简单,DIV+CSS布局,目录结构为index.html页面、js、css和images文件夹。/ 02 /图摘/ 03 /_个人网站源码

随便推点

<jsp:include page="" /> org.apache.jasper.JasperException: Unable to compile c-程序员宅基地

文章浏览阅读404次。[b]引入一个页面,出现如下异常:[/b] [code="java"] 2010-10-6 11:44:08 org.apache.catalina.core.ApplicationDispatcher invoke严重: Servlet.service() for servlet jsp threw exceptionorg.apache.jasper.JasperExcept..._exception: unable to compile expression "$.data": syntax error token recogni

Android5.0 WebView中Http和Https混合问题-程序员宅基地

文章浏览阅读981次。http://blog.csdn.net/luofen521/article/details/51783914http://blog.csdn.net/luofen521/article/details/51783914http://blog.csdn.net/luofen521/article/details/51783914场景复现:

Laravel微信静默登录教程_laravel 微信登录-程序员宅基地

文章浏览阅读252次。注:用户表字段必须有oppid & session_key。_laravel 微信登录

Resources (library) in JSF 2.0_outputscript-程序员宅基地

文章浏览阅读339次。In JSF 2.0, all your web resources files like css, images or JavaScript, should put in “resources” folder, under the root of your web application (same folder level with “WEB-INF“).The sub-folder under_outputscript

文本处理命令(增删改查文本)_grep 找到重复的字符,删除-程序员宅基地

文章浏览阅读402次。一、显示文本(一)more命令1.语法格式格式:more [选项] filename功能:读取filename中的内容,逐屏往下翻页显示,按h显示帮助,按q退出。2.选项-d, --silent display help instead of ringing bell-f, --logical count logical rather than screen lines-l, --no-pause suppress pause after form feed-c, --print-over do_grep 找到重复的字符,删除

Git忽略文件的几种方法,以及.gitignore文件的忽略规则_git 忽略-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏37次。除了可以在项目中定义**.gitignore文件外,还可以设置全局的git .gitignore文件**来管理所有Git项目的行为。这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。这种方式也需要创建相应的.gitignore文件,可以放在C:/Users/用户名/目录下。_git 忽略