微信小程序网络请求封装

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

封装的目的是为了偷懒,试想一下每次都要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.mzph.cn/diannao/70056.shtml

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

相关文章

Element Plus table 去除行hover效果

需求: 给table的指定行设置高亮背景色且去除掉这些行的hover效果 思路: 给指定行设置css类名选择需要设置高亮的行的单元格,设置鼠标禁用属性让高亮行继承父元素的背景色 考虑到表格的第一列是勾选框,因此仅选择 tr 下除了第一…

认识vue-admin

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最…

无人机航迹规划:孟加拉虎优化( Savannah Bengal Tiger Optimization ,SBTO)算法求解无人机路径规划MATLAB

一、孟加拉虎优化算法 孟加拉虎优化( Savannah Bengal Tiger Optimization ,SBTO)算法模拟了孟加拉虎的群体狩猎行为,采用了猎物搜索、隐身接近和攻击狩猎三种策略。 参考文献: [1]Yujing Sun, Xingguo Xu. Savann…

sib报错:com.*.xctrunner is not in your device!

1、问题描述 在使用sonic集成IOS设备的时候,我们需要通过sonic-agent服务去识别IOS设备。但是在识别的时候提示如下问题: 本质就是在你这个设备中找不到这个设备也就是找不到WebDriverAgentRunner,但是确实安装了,甚至appium可以正常的调用。 或执行如下命令的时候报错:…

c++中什么时候应该使用final关键字?

在C中,final关键字是自C11标准引入的重要特性,主要用于类继承和虚函数重写机制的约束。下面从技术原理、使用场景和最佳实践三个维度进行系统分析,并给出工业级代码示例。 目录 一、技术原理深度解析 二、关键使用场景分析 1. 类级别的fi…

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型,本文将详细介绍整个过程,涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…

文件夹上传到github分支最后github上面还是没有文件和文件夹

环境: github 问题描述: 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案: 从 git ls-tree -r HEAD 的输出中可以看到,metahuman-stream 文件夹显示为如下内容: 160000 commi…

【JavaEE进阶】验证码案例

目 🌲实现说明 🎄Hutool介绍 🌳准备工作 🌴约定前后端交互接口 🚩接口定义 🚩实现服务器后端代码 🚩前端代码 🚩整体测试 🌲实现说明 随着安全性的要求越来越⾼…

4G模块非必要,不关机!关机建议先进飞行模式

给4G模组VBAT断电关机,模组关机前未能及时退出当前基站,会有什么影响呢? 基站会误以为设备还在线,下次开机仍会拿着上次驻网信息去连基站。基站一看,上次链接还在——认为你是非法设备,拒绝链接&#xff…

Flutter中 List列表中移除特定元素

在 Dart 语言里,若要从子列表中移除特定元素,可以使用以下几种方法,下面为你详细介绍: 方法一:使用 where 方法创建新列表 where 方法会根据指定的条件筛选元素,然后通过 toList 方法将筛选结果转换为新列…

CF 148A.Insomnia cure(Java实现)

题目分析 这道题翻译出来后比较难理解,但是实际情况就是从1遍历d,看能不能被前四个值整除 思路分析 由上所述,存值后判断是否能整除,整除就答案1 代码 import java.util.*;public class Main {public static void main(String[]…

Java:单例模式(Singleton Pattern)及实现方式

一、单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景,例如日志记录器、配置管理、线程池、数据库…

企业SSL 证书管理指南

文章从以下几个部分展开 SSL证书的用途和使用场景SSL证书的申请类型和实现方式SSL证书的管理SSL证书的续签 一、SSL 证书的用途和使用场景 1.1 为什么要使用 SSL 证书? 1. 数据安全 🛡️- 在 HTTP 传输中,TCP 包可以被截获,攻…

网络安全-攻击流程-传输层

传输层攻击主要针对OSI模型的第四层,涉及TCP和UDP协议的安全漏洞。以下是常见攻击类型及其流程,以及防御措施: 1. SYN洪水攻击(TCP半连接攻击) 攻击流程: 目标选择:确定目标服务器的IP地址和开…

朝天椒USB服务器解决前置机U盾虚拟机远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术,解决前置机虚拟化部署后U盾的远程连接问题。 在金融、电信等关键行业,后台核心处理系统承担着至关重要的业务数据交互职责。为保障系统安全,这些单位要求企业通过前置机与他们的内网进行数据…

探索Java中的集合类_特性与使用场景

1. 引言 1.1 Java集合框架概述 Java集合框架(Java Collections Framework, JCF)是Java中用于存储和操作一组对象的类和接口的统称。它提供了多种数据结构来满足不同的需求,如列表、集合、映射等。JCF的核心接口包括Collection、List、Set、Queue和Map,以及它们的各种实现…

MySQL数据库误删恢复_mysql 数据 误删

2、BigLog日志相关 2.1、检查biglog状态是否开启 声明: 当前为mysql版本5.7 当前为mysql版本5.7****当前为mysql版本5.7 2.1.1、Navicat工具执行 SHOW VARIABLES LIKE LOG_BIN%;OFF 是未开启状态,如果不是ON 开启状态需要开启为ON。{默认情况下就是关闭状态} 2.…

读 DeepSeek-R1 论文笔记

DeepSeek-R1:通过强化学习激发大语言模型的推理能力 DeepSeek-AI 摘要 我们推出第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero作为无需监督微调(SFT)预训练阶段、直接通过大规模强化学习(RL)训练的基础模型,展现出卓越的推理能力。…

Vue2/Vue3分别如何使用Watch

在 Vue 2 和 Vue 3 中,watch 用于监听数据的变化并执行相应的逻辑。虽然两者的核心功能相同,但在语法和使用方式上有一些区别。以下是 Vue 2 和 Vue 3 中使用 watch 的详细说明: Vue 2 中的 watch 在 Vue 2 中,watch 是通过选项式…

分享一些处理复杂HTML结构的经验

在处理复杂HTML结构时,尤其是使用Java爬虫和Jsoup进行数据抓取时,以下是一些实用的经验和技巧,可以帮助你更高效地解析和提取数据: 1. 缩小解析范围 对于复杂的HTML结构,尽量缩小解析范围,只解析所需的元…