小程序账号设置以及request请求的封装

news2024/11/19 6:41:24

一般开发在小程序时,都会有测试版和正式版,这样在开发时会比较方便。

在开发时。产品经理都会给到测试账号和正式账号,后端给的接口也都会有测试环境用到的接口和正式环境用到的接口。

这里讲一讲我这边如何去做的。

1.在更目录随便命名一个以.js结尾的文件,

2.写入自己环境的选择

这里先用const命名常量,其中ENV_TEST为测试环境,ENV_PRODUCT为正式环境,然后用ENV去设置测试环境还是正式环境,用测试环境,就把const ENV = ENV_PRODUCT注释掉,反之把测试环境注释掉。这里的appid是在小程序中申请账号时得到的。在微信开发者工具修改的话可以在右上角详情里面的appid那里点击修改。

然后我们看ApiBaseUrl,下面那个ApiBaseUrl1不看。你会发现有个if判断,这个判断主要是判断是正式环境还是测试环境,正式环境的话,我们就可以写上协议(https)和域名(类似与192.168.10.107),可以看到我这边测试环境用到的是"https://devapi/"开头,正式环境是"https://api/"开头,后面的端口都是不一样的,所以不写在里面。

最后可以用module.exports将数据暴露出来。(不调用是无法获取到数据的)所以要先引用再获取数据。

下面为request请求封装展示例子:

import md5 from 'blueimp-md5'//请求用MD5加密
import {
  userCache
} from "../../utils/storage/user.js"
const config = require("../../config.js")
const env = config.ENV
const apiBaseUrl = config.ApiBaseUrl
const salt = config.SignatureSalt

class Api {

  constructor() {
    // 从缓存中获取token
    const appUserInfo = userCache.getAppUserInfo()
    if (appUserInfo !== null && appUserInfo.hasOwnProperty('token')) {
      this.token = appUserInfo.token
    } else {
      this.token = null
    }
  }

  request({
    url, // 请求url地址
    data, // 请求数据
    method = "GET", // 请求方式
    header = {}, // 请求头
    timeout = 10000, // 请求超时时间 默认2000毫秒
    dataType = "json", // 返回数据格式
    responseType = "text", // 响应的数据类型
  }) {
 
    // 设置签名
    const timestamp = Math.round(new Date().getTime() / 1000).toString()
    const randomStr = Math.random().toFixed(10).slice(-10)
    const signature = md5(randomStr.toString() + timestamp.toString() + salt)

    let baseHeaders = {
      "content-type": "application/json",
      "CLIENT": "wx-xcx-v1.0.0",
      "TIMESTAMP": timestamp,
      "RANDOMSTR":randomStr,
      "SIGNATURE": signature,
    }
    let headers = Object.assign(baseHeaders, header)//Object.assign合并对象方法

    // 判断登录状态
    if (loginStatus) {
      headers = Object.assign(headers, {
        "Authorization": "jwt " + this.token
      })
    }
    wx.request({
      url: apiBaseUrl + url,
      data: data,
      header: headers,
      timeout: timeout,
      method: method,
      dataType: dataType,
      responseType: responseType,
      success: function (res) {
        const code = res.statusCode
        const data = res.data
        if (code === 200) {
          wx.showToast({
            title: detail,
            icon: 'none',
          })
          return false
        }
        // 判断data是否是对象
        if (data.constructor !== Object && code === 404) {
          wx.showToast({
            title: "接口地址错误",
            icon: 'none',
          })
          return false
        }
        
      },
      fail: function (res) {
        // 处理特殊fail的方法
        if (fail) {
          fail(res);
          return;
        }
        const errMsg = res.errMsg
        if (errMsg.indexOf("timeout") !== -1) {
          wx.showToast({
            title: "超时啦,请稍后再试。",
            icon: 'none',
          })
        } else if (errMsg.indexOf("fail") !== -1) {
          wx.showToast({
            title: "失败啦,请稍后再试。",
            icon: 'none',
          })
        } else {
          wx.showToast({
            title: res.errMsg,
            icon: 'none',
          })
        }
      },
      complete: function (res) {
        wx.hideNavigationBarLoading()
        if (complete) {
          complete(res)
        }
      }
    })
  }

  post(obj) {
    // 判断是对象
    if (Object.prototype.toString.call(obj) !== '[object Object]') {
      throw new Error('obj必须是对象。')
    }
    this.request(Object.assign(obj, {
      method: "POST"
    }))
  }

  get(obj) {
      console.log(obj);
    // 判断是对象
    if (Object.prototype.toString.call(obj) !== '[object Object]') {
      throw new Error('obj必须是对象。')
    }
    this.request(Object.assign(obj, {
      method: "GET"
    }))
  }

  setToken(token) {
    this.token = token
  }

  getToken() {
    return this.token
  }

  removeToken() {
    this.token = null
  }
}

let api = new Api()


class ApiSync {

}

module.exports = {
  api: api
}

上面代码中看到有一个class类

ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

生成类的实例的写法,与 ES5 完全一样,也是使用new命令。前面说过,如果忘记加上new,像函数那样调用Class,将会报错。

可以看到里面写了request()里面存放着url,data,等wx.request()用到的信息。下面写的是发送请求时携带的签名,主要起到加密作用,防止数据泄露。下面就正式写了一个wx.request()来请求数据,这个不多说什么。

那它到底怎样实现请求数据的,下面我写了一个post和get方法,然后将整个class类放到了api变量里面,然后用用module.exports = {api:api}将它暴露出来,这样在page页面中你要请求数据时要先引入这个封装好的js文件。这里我是将它封装在utils里面的request中的api.js中,这些都是自己创建的并不是小程序自带的。如图:

在page(这里的page页面指的是开发时创建的页面)页面中先要引入api.js,如上面所示,然后要请求数据的话方法如下图(这是post请求,get请求将post改成get即可,其它不变)。可能有人会疑惑为什么这样写,下面讲一下逻辑。

这里用api.post()或者是api.get()请求都会到api.js中去执行之前封装的post或者get方法,这样就相当于把这里面api.post()中对象的数据传到api.js中的post方法里面。

上面那个if判断可以不看,看下面的this.request(),这里是将之前的那个request里面的数据和这里的请求方式合并。在上面那个request里面可以看到里面的method写的是GET,但是因为我们用到了Object.assign这个对象合并方法,所以它将之前那个method的数据覆盖了,这就要取了解Object.assign使用方法,这里简单说明一下,当合并多个对象时,对象中出现重复的名称,后面的会覆盖前面的数据。

然后request里面的数据就是要用到的数据,将其直接放到wx.request()里,再用wx.request()去请求数据成功后就可以获取到想要数据了,可以用console.log(obj)打印数据查看。所以本质上还是要用到wx.request()这个发请求,那为什么要绕这么大一个湾呢?

主要还是节省代码量,方便管理。可以将所有要用到的接口写在一个js文件里面,然后暴露,要用到的时候引入调用即可,就像这样。

这里面就不需要写https什么的,因为之前在cofig.js中已经写好了,在api.js中会看到有引入cofig.js,其中的apiBaseUrl就是

然后在wx.request()中有url:apiBaseUrl + url,这里就是整个接口了,示例:https://www.baidu.com/s/gdgd/gdgd,https://www.baidu.com/就是apiBaseUrl,s/gdgd/gdgd就是要封装起来的接口,这种接口肯定不止一个,封装在一起就好管理,也方便找。这里有个查找的小技巧,按键盘的Ctrl建,鼠标放在要查找的接口上会发现变成蓝色并有下划线,点击就会跳转到其具体位置。页面中的wxml中的写的点击事件也可以这样快速查找到具体位置。或者直接复制用Ctrl+f键进行查找。

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

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

相关文章

Ubuntu20安装torch1.13和pytorch_geometric2.3.0(对应cuda11.6)

在torch下载页面搜索1.13https://pytorch.org/get-started/previous-versions/,wheel安装方式(激活conda虚拟环境) pip install torch1.13.0cu116 torchvision0.14.0cu116 torchaudio0.13.0 --extra-index-url https://download.pytorch.org…

“100先生”逢跌加仓

原创 | 刘教链 BTC(比特币)从前日创下的局部低点56.5k持续修复至59k上方,距离重回6万刀仅有半步之遥。 群里有群友还在等25k。还有朋友发来消息问,这次是不是有机会跌回15k? 躺下睡一觉。梦里会有的。 就在前两天ETF们…

时间复杂度空间复杂度 力扣:转轮数组,消失的数字

1. 算法效率 如何衡量一个算法的好坏?一般是从时间和空间的维度来讨论复杂度,但是现在由于计算机行业发展迅速,所以现在并不怎么在乎空间复杂度了下面例子中,斐波那契看上去很简洁,但是复杂度未必如此 long long Fib…

BAPI_PR_CHANGE how to add account assignment information for service line,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

数据结构(十)----图

目录 一.图的概念 1.图的定义 2.图的类别 3.图的性质 4.几种特殊形态的图 二.图的存储结构 1.邻接矩阵(顺序存储) 2.邻接表(顺序链式存储) 3.十字链表 4.邻接多重表 四.图的遍历 1.广度优先遍历(BFS&#…

Elasticsearch 数据聚合

Bucket聚合(桶聚合) 对文档做分组,aggs 按照文档字段值或日期进行分组,能参与分词的字段不能做聚合,如text类型的字段 例如:根据城市名称做聚合,也就是城市名称对数据进行分组统计。可以加qu…

Python数据分析案例43——Fama-French回归模型资产定价(三因子/五因子)

案例背景 最近看到要做三因子模型的同学还挺多的,就是所谓的Fama-French回归模型,也就是CAMP资本资产定价模型的升级版,然后后面还升级为了五因子模型。 看起来眼花缭乱,其实抛开金融资产定价的背景,从机器学习角度来…

2024年3月Scratch图形化编程等级考试(三级)真题试卷

2024年3月Scratch图形化编程等级考试(三级)真题试卷 选择题 第 1 题 Scratch运行程序后,角色一定不会说出的数字是?( ) A.2 B.4 C.6 D.8 第 2 题 Scratch角色初始位置如下图所示,右图…

Spring Boot与OpenCV:融合机器学习的智能图像与视频处理平台

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

spring框架学习记录(2)

文章目录 注解开发bean相关注解开发定义bean纯注解开发纯注解开发中bean的管理 依赖注入相关依赖注入第三方bean管理第三方bean依赖注入 AOP(Aspect Oriented Programming)面向切面编程AOP简介AOP核心概念AOP工作流程AOP切入点表达式通知类型AOP通知获取数据 注解开发 bean相关…

大语言模型中的第一性原理:Scaling laws

大语言模型的尺度定律在大语言模型的训练过程中起到了非常重要的作用。即使读者不参与大语言模型的训练过程,但了解大语言模型的尺度定律仍然是很重要的,因为它能帮助我们更好的理解未来大语言模型的发展路径。 1. 什么是尺度定律 尺度定律&#xff08…

现代循环神经网络(GRU、LSTM)(Pytorch 14)

一 简介 前一章中我们介绍了循环神经网络的基础知识,这种网络 可以更好地处理序列数据。我们在文本数据上实现 了基于循环神经网络的语言模型,但是对于当今各种各样的序列学习问题,这些技术可能并不够用。 例如,循环神经网络在…

【错题集-编程题】十字爆破(预处理 + 模拟)

牛客对于题目链接:十字爆破 (nowcoder.com) 一、分析题目 暴力模拟会超时。 预处理,先把每一行以及每一列的和存起来。 模拟即可,但是由于数据量过⼤,我们可以提前把每⼀⾏以及每⼀列的和存起来,⽅便统计总和。 二、代…

(centos)yum安装mysql8.4

1.MySQL官方已经提供了适用于不同Linux发行版的预构建软件包,包括适用于CentOS的Yum Repository MySQL :: MySQL Community Downloads 2.在/usr/local文件夹下创建mysql文件夹,将下载的rpm文件放到目录下 3.执行安装命令 yum install mysql-community-…

思科防火墙查如何查看现有ipsec隧道信息

环境: 思科ASA5555 问题描述: 思科防火墙查如何看现有ipsec隧道信息 解决方案: 1.进入特权模式: enable 查看isakmp信息 show crypto isakmp sa2.查看ipsec信息 show crypto ipsec sa上述命令将显示当前的ISAKMP安全关联…

leetCode69. x 的平方根

leetCode69. x 的平方根 题目思路 常见的二分法模板&#xff08;背过就行&#xff0c;模板而已&#xff09; // 区间[L,R]被划分为[L,mid]和[mid 1, R]时使用这个模板 int bsearch_1(int l, int r){while(l < r){int mid l r >> 1;if(check(mid)) r mid; //che…

08 IRF技术 华三交换机实现

IRF 详细介绍 我知道 AI IRF 技术是指集成路由功能(Integrated Routing and Bridging)技术,是惠普(Hewlett Packard)公司开发的一种基于硬件的虚拟化技术。IRF 技术可以将多台物理设备组合成一个逻辑设备,实现设备的高可用性和灵活性。 IRF 技术主要有以下特点: 1. …

【强训笔记】day9

NO.1 思路&#xff1a;利用两个string&#xff0c;一个输入数据&#xff0c;一个做逗号处理&#xff0c;如果该字符的位数减去下标减去1等于3的倍数的话&#xff0c;该位置就插入逗号。 代码实现&#xff1a; #include<iostream> #include<string> using names…

Redis事务,管道,发布订阅

Redis事务 redis事务本质上是一组命令的集合,按照顺序串行化执行命令而不被其他命令打断 redis事务开启后将要执行的命令放到事务队列中,提交事务后一次性顺序排他地执行所有命令 关键词:单线程,无隔离级别,不保证原子性,排他性,顺序性 要注意和mysql的acid进行区分 怎么用…

C++:智能指针(RAII思想)

目录 1、什么是智能指针&#xff1f; 2、为什么需要智能指针 3、RAII思想及智能指针的原理 4、智能指针的发展 4.1 auto_ptr 4.2 unique_ptr 4.3 share_ptr 5、share_ptr的模拟实现 6、循环引用问题 7、share_ptr中的自定义删除器 1、什么是智能指针&#xff1f; 智能…