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

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

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

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

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键进行查找。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达2022机器学习专项课程(一)正则化(正则化成本函数正则化线性回归正则化逻辑回归)

目录 一.正则化1.1 正则化的好处1.2 正则化的实现方式 二.正则化改进线性回归的成本函数2.1 正则化后的成本函数的意义2.2 λ参数的作用2.3 不同λ对算法的影响2.4 为什么参数b没有正则化项 三.正则化线性回归的梯度下降3.1 为什么正则化可以在梯度下降迭代中减小w3.2 导数的计…

如何在Mac上恢复格式化硬盘的数据?

“嗨,我格式化了我的一个Mac硬盘,而没有使用Time Machine备份数据。这个硬盘被未知病毒感染了,所以我把它格式化为出厂设置。但是,我忘了备份我的文件。现在,我想恢复格式化的硬盘驱动器并恢复我的文档,您能…

面试算法题精讲:最长公共子串

面试算法题精讲:最长公共子串 最长公共子串问题是指给定两个字符串S1和S2,求它们的公共子串中最长的那一个。其实就是求两个字符串的最长重复子串。 最朴素的算法就是枚举S1和S2的每一对子串,然后判断它们是否相等,时间复杂度是…

手搓堆(C语言)

Heap.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <stdbool.h> #include <string.h> typedef int HPDataType; typedef struct Heap {HPDataType* a;int size;int capacity; }Heap;//初始化 void Heap…

Java Jackson-jr 库是干什么用的

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择&#…

如何从Mac电脑恢复任何删除的视频

Microsoft Office是包括Mac用户在内的人们在世界各地创建文档时使用的最佳软件之一。该软件允许您创建任何类型的文件&#xff0c;如演示文稿、帐户文件和书面文件。您可以使用 MS Office 来完成。所有Microsoft文档都可以在Mac上使用。大多数情况下&#xff0c;您处理文档&…

苹果CEO对未来一代人工智能投资持乐观态度

尽管在动荡的第二季度&#xff0c;苹果的收入和iPhone销量有所下降&#xff0c;但其新兴的人工智能技术可能会带来急需的提振。 在5月2日的电话财报会议上&#xff0c;苹果公布季度收入为908亿美元&#xff0c;比去年下降4%。iPhone的收入也下降了10%&#xff0c;至460亿美元。…

《Python编程从入门到实践》day19

#昨日知识点回顾 使用unittest模块测试单元和类 #今日知识点学习 第12章 武装飞船 12.1 规划项目 游戏《外星人入侵》 12.2 安装pygame 终端管理器执行 pip install pygame 12.3 开始游戏项目 12.3.1 创建Pygame窗口及响应用户输入 import sysimport pygameclass…

SpringCloud微服务项目创建流程

为了模拟微服务场景&#xff0c;学习中为了方便&#xff0c;先创建一个父工程&#xff0c;后续的工程都以这个工程为准&#xff0c;实用maven聚合和继承&#xff0c;统一管理子工程的版本和配置。 后续使用中只需要只有配置和版本需要自己规定之外没有其它区别。 微服务中分为…

电脑数据怎么拷贝到u盘?操作指南与数据丢失防范

在数字时代&#xff0c;数据的传输与备份已成为我们日常生活和工作中不可或缺的一部分。U盘作为一种便捷、高效的移动存储设备&#xff0c;广泛应用于各种数据拷贝场景。无论是个人文件的备份&#xff0c;还是工作资料的传输&#xff0c;U盘都发挥着举足轻重的作用。那么&#…

【刷题(1)】链表

一、链表问题基础 移动:head=head.next 移动到最后:head.next=null 停止:if not xx: 相当于if not null: 取值:a.val 赋值:b.next=a 遍历:while head: head=head.next 或者: if not head: head=head.next 递归:单链表: def func(pre,cur): return func(pre.next,cur.…

Windows安装Ubuntu24详细教程

从官网下载ISO镜像&#xff1a; 使用VMWare创建新的虚拟机&#xff1a; 选择刚才下载的ISO镜像&#xff1a; 填写账号和密码&#xff1a; 选择安装位置和虚拟机名称&#xff0c;因为我装这个主要是为了QT开发的&#xff0c;所以名字叫ubuntu24_for_qt&#xff1a; 处理…

基于大爆炸优化算法的PID控制器参数寻优matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于大爆炸优化算法的PID控制器参数寻优matlab仿真。对比优化前后的PID控制输出。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a .....................…

前端 JS 异常那些事

前言 人无完人&#xff0c;所以代码总会出异常的&#xff0c;异常并不可怕&#xff0c;关键是怎么处理 什么是异常 程序发生了意想不到的情况&#xff0c;影响到了程序的正确运行 从根本上来说&#xff0c;异常就是一个普通的对象&#xff0c;其保存了异常发生的相关信息&a…

通过符号程序搜索提升prompt工程

原文地址&#xff1a;supercharging-prompt-engineering-via-symbolic-program-search 通过自动探索​​大量提示变体来找到更好的提示 2024 年 4 月 22 日 众所周知&#xff0c;LLMs的成功在很大程度上仍然取决于我们用正确的指导和例子来提示他们的能力。随着新一代LLMs变得越…

django搭建一个AI博客进行YouTube视频自动生成文字博客

文章目录 一、生成Django框架二、项目代码&#xff08;前端&#xff09;1、编写前端代码&#xff08;正文界面&#xff09;1.1、生产html框架1.2、添加live preview扩展1.3、更改title元素中文本1.4、添加CDN&#xff08;CSS&#xff09;样式链接1.5、nav标签1.6、在body标签中…

021、Python+fastapi,第一个Python项目走向第21步:ubuntu 24.04 docker 安装mysql8、redis(二)

系列文章目录 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 安装redis 我会以三种方式安装&#xff0c; 第一、直接最简单安装&#xff0c;适用于测试环境玩玩 第二、conf配置安装 第三、集群环境安装 一…

Flutter笔记:Widgets Easier组件库(9)使用弹窗

Flutter笔记 Widgets Easier组件库&#xff08;9&#xff09;&#xff1a;使用弹窗 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理

三种更新策略 内存淘汰是Redis内存的自动操作&#xff0c;当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire)&#xff0c;有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新&#xff0c;所以接下来研究主动更新策略。 主动更新策略…

CSS 鼠标经过放大元素 不影响其他元素

效果 .item:hover{transform: scale(1.1); /* 鼠标悬停时将元素放大 1.1 倍 */ }.item{transition: transform 0.3s ease; /* 添加过渡效果&#xff0c;使过渡更加平滑 */ }