微信小程序网络请求封装

news2025/2/18 14:54:13

微信小程序的网络请求为什么要封装?封装使用有什么好处?

封装的目的是为了偷懒,试想一下每次都要wx.request,巴拉巴拉传一堆参数,是不是很麻烦,有些公共的参数例如header,baseUrl是不是可以封装起少些一些代码。

同时也是为了避免回调地狱,例如一个请求要依赖于上一个请求的回调结果,那么我们就需要嵌套。这样一层一层的嵌套不利于代码维护。

综上就写个封装吧(我的就是简单封装了下,没有参照大神们的复杂封装,我就是为了单纯请求时候想少些几个参数)....

1.新建request.js文件

class WxRequest{
  constructor(){

  }
  defaults={
    baseUrl:'http://36.137.4.235:8080',
    header:{
      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e",
      Authorization:"",
    }
  }
  interceptors={
    request:(config)=>{
      return config;
    },
    response:(response)=>{
      return response;
    }
  }
  request(options){
    let access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJtWFFhSEhZa01DQ3NuYkNpZmozWjNLN3dOaFZVRDdEMCIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.qfyBJcuu5mEdxKzT3vkvPXxZOgbiHMvmvhEi2IiNpFE";
    this.defaults.header.Authorization="Bearer " + access_token
    options.url=this.defaults.baseUrl + options.url;
    options={...this.defaults,...options}
    return new Promise((resolve,reject)=>{
      wx.request({
        ...options,
        success:(res)=>{
          resolve(res)
        },
        fail:(err)=>{
          reject(err)
        }
      })
    })
  }
}

const instance = new WxRequest();
instance.interceptors.request=(config)=>{
  return config;
}
instance.interceptors.response=(response)=>{
  return response;
}
export default instance;

 上面我们就创建好了一个request.js文件,并且里面创建了一个Wx.Request类。并且实例化了一下。

下面我们看一下如何调用这个我们创建的实例化对象

 1.用request.js文件并且使用

import instance from "../../utils/request"

Page({

onLoad: function (options) {

    this.getList();

  },

  async getList(){

    let res = await instance.request({

      url:'/desktop/icon/list',

      method:"GET",

      data:{

        pageSize:"10",

        pageNum:"1",

        isAsc:"desc"

      }

    })

    console.log(res)

  

  },

})

 以上就是一个简单的封装方法,复制粘贴就能用。

里面有个问题,如何不写入async 和await 会这么么样?

没错,时返回一个promise对象。

2.完善请求-statusCode状态码

其实方法里面还有一些问题,这个问题就是,在小程序中,只要服务端返回了结果,就会进入到小程序的success中,那么当服务器返回的结果是401或者是500等结果,也同样进入到了success中,因此上述中就缺少了相关返回结果的判断,下面代码中我们加入statusCode的判断来完善风封装的请求。

我是直接写在了wx.request里面用 switch case 来判断的,你也可以写在别的地方。例如写在拦截器请求拦截器和响应拦截器中,我是觉得我开始参数合并、修改啥的都写在了方法里面,我就依旧在wx.request里面来写就算了。

class WxRequest{

  constructor(){

  }

  defaults={

    baseUrl:'http://36.137.4.235:8080',

    header:{

      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e",

      Authorization:"",

    }

  }

  interceptors={

    request:(config)=>{

      return config;

    },

    response:(response)=>{

      return response;

    }

  }

  request(options){

    let access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJjOFJHelNVQ3RjMGVhWkJxV1VzY3lEb2V4T0dMbXB0ZiIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.sacBfJ8qPOEICfFTpbxgRaQN2A368rZITV6_jwB4_-Y";

    this.defaults.header.Authorization="Bearer " + access_token

    options.url=this.defaults.baseUrl + options.url;

    options={...this.defaults,...options}

    return new Promise((resolve,reject)=>{

      wx.request({

        ...options,

        success:(res)=>{

          switch (res.data.code) {

            case 200:

              return resolve(res.data)

            case 401:

             wx.showModal({

              title: '系统提示',

              content: '登陆过期,请重新登录',

              showCancel:false,

              success (modalres) {

                if (modalres.confirm) {

                  console.log('用户点击确定');

                }

              }

             })

             return Promise.reject(res)

            default:

              wx.showToast({

                title: '系统更新中...',

                duration:3000

              })

              return Promise.reject(res)

        }

          

        },

        fail:(err)=>{

          reject(err)

        }

      })

    })

  }

}

const instance = new WxRequest();

instance.interceptors.request=(config)=>{

  return config;

}

instance.interceptors.response=(response)=>{

  return response;

}

export default instance;

2.使用的话参照之前1.使用就行了,没啥大变化。

3.封装更加便捷的方法

大家在用的时候,有没有发现,每次请求虽然比之前简单了,但是还是不够简单。下面我们利用request这个定义的方法,在创建几个更快捷的请求方法。 

class WxRequest{

  constructor(){

  }

  defaults={

    baseUrl:'http://36.137.4.235:8080',

    header:{

      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e",

      Authorization:"",

    },

    method:"GET",

    data:null

  }

  interceptors={

    request:(config)=>{

      return config;

    },

    response:(response)=>{

      return response;

    }

  }

  request(options){

    let access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJjOFJHelNVQ3RjMGVhWkJxV1VzY3lEb2V4T0dMbXB0ZiIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.sacBfJ8qPOEICfFTpbxgRaQN2A368rZITV6_jwB4_-Y";

    this.defaults.header.Authorization="Bearer " + access_token

    options.url=this.defaults.baseUrl + options.url;

    options={...this.defaults,...options}

    return new Promise((resolve,reject)=>{

      wx.request({

        ...options,

        success:(res)=>{

          switch (res.data.code) {

            case 200:

              return resolve(res.data)

            case 401:

             wx.showModal({

              title: '系统提示',

              content: '登陆过期,请重新登录',

              showCancel:false,

              success (modalres) {

                if (modalres.confirm) {

                  console.log('用户点击确定');

                }

              }

             })

             return Promise.reject(res)

            default:

              wx.showToast({

                title: '系统更新中...',

                duration:3000

              })

              return Promise.reject(res)

        }

          

        },

        fail:(err)=>{

          reject(err)

        }

      })

    })

  }

  get(url,data){

    return this.request({url:url,method:"GET",data:data})

  }

 post(url,data){

    return this.request({url:url,method:"POST",data:data})

  }

 put(url,data){

    return this.request({url:url,method:"PUT",data:data})

  }

 delete(url,data){

    return this.request({url:url,method:"DELETE",data:data})

  }

}

const instance = new WxRequest();

instance.interceptors.request=(config)=>{

  return config;

}

instance.interceptors.response=(response)=>{

  return response;

}

export default instance;

 

3.引用request.js文件并且使用新的快捷方法

import instance from "../../utils/request"

Page({

onLoad: function (options) {

    this.getList();

  },

  async getList(){

    let data = {

        pageSize:"10",

        pageNum:"1",

        isAsc:"desc"

      }

    let res = await instance.get('/desktop/icon/list',data)

    console.log(res)

  },

})

这样是不是更简单了....哈哈哈哈 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2297816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

瑞芯微烧写工具

文章目录 前言一、安装驱动二、安装烧写工具1.直接解压压缩包2. 如何使用 三、MASKROM 裸机必备四、LOADER 烧写,前提是搞过第三步没问题五、Update.img包的烧录六、linux下烧写总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要…

抖音SEO短视频矩阵系统源码:短视频流量密码揭秘

在开发短视频SEO优化排名技术时,仅通过get和set这两个代理无法完全实现目标。实际上,还需要实现has、ownKeys以及getOwnPropertyDescriptor等代理,以更全面地控制私有属性的访问权限。这些代理对于限制对私有属性的访问至关重要。 该技术主要…

【工业安全】-CVE-2022-35561- Tenda W6路由器 栈溢出漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1:代码分析 4.2:流量分析 5.poc代码: 1.漏洞描述 漏洞编号:CVE-2022-35561 漏洞名称:Tenda W6 栈溢出漏洞 威胁等级:高危 漏洞详情&#xff1…

【GRPO】GRPO原理原文翻译

论文:DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models 注!这里我仅仅翻译GRPO部分供学习使用。其他部分请去看原文。 4. 强化学习(Reinforcement Learning) 4.1. 群组相对策略优化&#xf…

侯捷 C++ 课程学习笔记:C++ 新标准 11/14 的革新与实战应用

在侯捷老师的 C 系列课程中,《C 新标准 11/14》这门课程让我对现代 C 编程有了全新的认识。C11 和 C14 是 C 语言发展史上的重要里程碑,它们引入了大量新特性,极大地提升了语言的表达能力和开发效率。侯捷老师通过深入浅出的讲解和丰富的实战…

拉取Openwrt官方源码 编译固件速通

Openwrt 24.10上星期出了,但是恩山没几个人更新,自己编译一个,记录一下方法。 一切从简,不添加任何插件,资源扔恩山了。 【   】红米AX6000 openwrt V24.10.0 uboot大分区固件-小米无线路由器及小米网络设备-恩山无…

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了(本地)部署大语言模型,适合微调、数据高隐私性等场景。随着Deepseek-R1的发布,大语言模型的可及性得到极大提升,应用场景不断增加,对高可用的方…

DeepSeek 本地部署(电脑安装)

1.先安装Ollama 开源框架 网址链接为:Ollama 2.点中间的下载 3.选系统 4.下载好就安装 5.输入命令ollama -v 6.点击Model 7.选如下 8.选版本 9.复杂对应命令 10.控制台粘贴下载 11.就可以问问题啦 12.配置UI界面(在扩展里面输入) 13.配置完即可打开 14.选择刚才安装的就好啦…

【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

spann3r是利用dust3r做了增量式的点云重建,这里zeroGS在前者的基础上,进行了增量式的GS重建以及进行了pose的联合优化,这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而,…

《Python 中 JSON 的魔法秘籍:从入门到精通的进阶指南》

在当今数字化时代,网络编程无处不在,数据的高效传输与交互是其核心。JSON 作为一种轻量级的数据交换格式,凭借其简洁、易读、跨语言的特性,成为网络编程中数据传输与存储的关键技术。无论是前后端数据交互,还是不同系统…

【漫话机器学习系列】091.置信区间(Confidence Intervals)

置信区间(Confidence Intervals)详解 1. 引言 在统计学和数据分析中,我们通常希望通过样本数据来估计总体参数。然而,由于抽样的随机性,我们不可能得到精确的总体参数,而只能通过估计值(如均值…

回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核…

QTreeView添加网格线

一.效果 二.实现 网格线虽然可以用样式表添加,但效果不好。这里重写QTreeView的drawRow函数来实现网格线的绘制。 void QHTreeView::drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {QTreeView::drawRow(painter…

Golang的多团队协作编程模式与实践经验

Golang的多团队协作编程模式与实践经验 一、多团队协作编程模式概述 在软件开发领域,多团队协作编程是一种常见的工作模式。特别是对于大型项目来说,不同团队间需要协同合作,共同完成复杂的任务。Golang作为一种高效、并发性强的编程语言&…

AI前端开发的学习成本与回报——效率革命的曙光

近年来,人工智能技术飞速发展,深刻地改变着各行各业。在软件开发领域,AI写代码工具的出现更是掀起了一场效率革命。AI前端开发,作为人工智能技术与前端开发技术的完美结合,正展现出巨大的发展潜力,为开发者…

[创业之路-297]:经济周期与股市、行业的关系

目录 一、经济周期的种类 1、短周期(基钦周期) 2、中周期(朱格拉周期) 3、长周期(康德拉季耶夫周期) 当下处于康波周期的哪个阶段? 4、建筑周期(库涅茨周期) 二、…

Dav_笔记14:优化程序提示 HINTs -3

查询转换的提示 以下每个提示都指示优化程序使用特定的SQL查询转换: ■NO_QUERY_TRANSFORMATION ■USE_CONCAT ■NO_EXPAND ■REWRITE和NO_REWRITE ■MERGE和NO_MERGE ■STAR_TRANSFORMATION和NO_STAR_TRANSFORMATION ■事实和NO_FACT ■UNNEST和NO_UNNEST…

递归乘法算法

文章目录 递归乘法题目链接题目详解解题思路:代码实现: 结语 欢迎大家阅读我的博客,给生活加点impetus!! 让我们进入《题海探骊》,感受算法之美!! 递归乘法 题目链接 在线OJ 题目…

从当下到未来:蓝耘平台和 DeepSeek 应用实践的路径探索,勾勒 AI 未来新蓝图

我的个人主页 我的专栏:人工智能领域,希望能帮助到大家!!!点赞👍收藏❤ 引言:AI 浪潮中的双引擎 在人工智能蓬勃发展的时代,蓝耘平台与 DeepSeek 宛如推动这一浪潮前进的双引擎。…

Leetcode 算法题 9 回文数

起因, 目的: 数学法。 % 求余数, 拆开组合,组合拆开。 这个题,翻来覆去,拆开组合, 组合拆开。构建的过程。 题目来源,9 回文数: https://leetcode.cn/problems/palindrome-number…