小程序接口封装、异步加载、Promise

news2024/11/27 15:43:16

目录

1、页面准备

2、在app.js中处理当前环境以便切换api的环境、公共变量

3、定义post、get请求方法 request.js

4、api.js 接口列表调用index.js的post、get请求

5、index.js 需要返回数据的页面

api.js 、index.js 示例

异步实现 async、await


1、页面准备

目录结构:pages > index       与pages同级 utils > request.js、api.js

①页面index.js

②封装的post、get请求方法request.js

③接口请求列表 api.js(相同业务模块下的api可以统一整理到一个js中,方便管理修改等,也可不放同一个js中)

2、在app.js中处理当前环境以便切换api的环境、公共变量

// app.js
  //定义环境变量,和 api域名
  let env, apiUrl = 'https://appapi.5i5j.com';
  if (typeof __wxConfig === 'object') {
    let version = __wxConfig.envVersion;
    if (version === 'develop') {//开发版
      env = 'dev';
    } else if (version === 'trial') {//体验版 
      env = 'trial';
    } else { //生产
      env = 'release';
    }
  }
  //通过环境变量判断当前域名环境
  // apiUrl = env == 'release' ? '生产环境api' : '联调环境api';
  apiUrl = env == 'release' ? 'https://xxx.com' : 'https://xxx-test.com';
  console.log('当前环境:',env)

App({
  onLaunch() {
  },
  globalData: { //全局变量
    hostUrl:apiUrl, //api域名
    cityid:1 //接口上需要的城市
  }
})

3、定义post、get请求方法 request.js

//request.js
/***
 * POST请求
 * @param url 接口地址
 * @param data 请求参数
 * @param config 设置请求头
 */
export const post = (url, data = {}, config = {}) => {
  return new Promise((resolve, reject) => {
    wx.request({
      url,
      data,
      ...config,
      method: "POST",
      success: res => resolve(res),
      fail: err => reject(err)
    })
  })
}
/***
 * GET请求
 * @param url 接口地址
 * @param data 请求参数
 * @param config 设置请求头
 */
export const get = (url, data = {}, config = {}) => {
  return new Promise((resolve, reject) => {
    wx.request({
      url: url + parmasFormat(data),
      ...config,
      method: "GET",
      success: res => resolve(res),
      fail: err => reject(err)
    })
  })
}
/***
 * 处理GET请求地址拼接 
 * @param obj 请求的参数对象
 * @param 如 {a:1,b:2} 返回?a=1&b=2
 */
export const parmasFormat = (obj) => {
  let paramsStr = ""
  Object.keys(obj).forEach((key, index) => {
    paramsStr += (index === 0 ? '?' : '&') + key + '=' + (obj[key] ?? '')
  })
  return paramsStr
}

4、api.js 接口列表调用index.js的post、get请求

// api.js

//引入request.js 中的 POST、GET请求
import { post , get } from "./request"

const app = getApp()//获取App()的实例
const { globalData } = app //获取全局变量
const { hostUrl ,cityid } = globalData //获取api域名和城市 ,如果有多个可以这样分开写 ,如果只有一个可以和上一行写一起

/***
 * POST请求
 * @param hostUrl app.js中的接口域名
 * @param data 需要的参数
 * 1、请求头不需要传特殊参数
 */
export const postTest1 = data => post(
  hostUrl + `接口地址` ,
  data,
  {
    header: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'},
  }
)

/***
 * POST请求
 * @param hostUrl app.js中的接口域名
 * @param data 需要的参数
 * @param config 设置的header参数
 * 2、请求头需要传特殊参数
 */
export const postTest2 = (data,config) => post(
  hostUrl + `接口地址` ,
  data,
  config
)

/***
 * GET请求
 * @param hostUrl app.js中的接口域名
 * @param params 接口需要的参数
 * 1、请求头需要传特殊参数
 */
export const getTest= (params) => get(hostUrl + "接口地址", 参数对象)
/***
 * GET请求
 * @param hostUrl app.js中的接口域名
 * @param params 接口需要的参数
 * @param config 设置的header参数
 * 2、请求头需要传特殊参数
 */
export const getTest2 = (params,config) => get(hostUrl + "接口地址", 参数对象,设置的header)

5、index.js 需要返回数据的页面

// index.js
// 获取应用实例
const app = getApp()

//导入api请求列表  { 这里面的值对应的是 api 中的 postTest1:不单独设置header postTest2:单独设置header}
//import { 这里对应api里定义好的请求,用哪个写哪个,不需要的可以不写} from "../../utils/api"
import { postTest1 , postTest2, getTest,getTest2} from "../../utils/api"

Page({

  data: { },
  onLoad() { 
    //请求参数
    let params = {
		参数名1:值,
		参数名2:值
    }
    //设置请求头
    let headers= {
	    header:{
		    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', 
		    'deviceid': '设备id',
	    }
    }

    //header 里不需要单独在设置特别参数
	postTest1(params).then(res => {
      if(res.statusCode == '200'){
        console.log('success',res)
      }else{
        console.log('error',res)
      }
    })
    //设置请求头的请求
	postTest1(params,headers).then(res => {
      if(res.statusCode == '200'){
        console.log('success',res)
      }else{
        console.log('error',res)
      }
    })
    //get 不设置header
    getTest(params).then(res =>{
      console.log('success',res)
    }).catch((err) => {
      console.log('err',err)
    })

    //get 设置header
    getTest2(params,headers).then(res =>{
      console.log('success',res)
    }).catch((err) => {
      console.log('err',err)
    })

  }

})

api.js 、index.js 示例

// api.js

//引入request.js 中的 POST、GET请求
import { post , get } from "./request"

const app = getApp()//获取App()的实例
const { globalData } = app //获取全局变量
const { hostUrl ,cityid } = globalData //获取api域名和城市 ,如果有多个可以这样分开写 ,如果只有一个可以和上一行写一起

/***
 * POST请求  例如1
 * @param hostUrl app.js中的接口域名
 * @param data  接口需要的参数
 * 1、请求头不需要传特殊参数
 */
export const post1 = data => post(
  hostUrl + `/brokering/${cityid}/v1/brokerlist` ,
  data,
  {
    header: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'},
  }
)

/***
 * POST请求 例如2
 * @param hostUrl app.js中的接口域名
 * @param data 接口需要的参数
 * @param config 设置的header参数
 * 2、请求头需要传特殊参数
 */
export const post2 = (data,config) => post(
  hostUrl + `/appapi/renting/${cityid}/v1/list` ,
  data,
  config
)


/***
 * GET请求  例如3
 * @param hostUrl app.js中的接口域名
 * @param params 接口需要的参数
 * 1、请求头不需要传特殊参数
 */
export const get1 = (params) => get(hostUrl + "/appapi/sale/v2/recommend/index", params)

/***
 * GET请求  例如4
 * @param hostUrl app.js中的接口域名
 * @param params 接口需要的参数
 * @param config 设置的header参数
 * 2、请求头需要传特殊参数
 */
export const get1 = (params,config) => get(hostUrl + "/appapi/sale/v2/recommend/index", params,config)
// index.js
// 获取应用实例
const app = getApp()

import { post1 , post2 ,get1 ,get2 } from "../../utils/api"

Page({
  data: { },
  onLoad() { 
    let params = {
      cityid:1,
      communityid:200013141
    }
    let headers= {
      header:{
        'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', 
        'deviceid': '123',
      }
    }
    post1(params).then(res => {
      if(res.statusCode == '200'){
        if(res.data.status == '200'){
          console.log('res',res.data.data)
        }
      }else{
        console.log(res.data.msg)
      }
    })
    
    post2(params,headers).then(res => {
      if(res.statusCode == '200'){
        if(res.data.status == '200'){
          console.log('listHouse,res',res)
        }
      }else{
        console.log(res.data.msg)
      }
    })

    get1(params).then(res =>{
      console.log('res2',res)
    }).catch((err) => {
      console.log(err)
    })

    get2(params,headers).then(res =>{
      console.log('res3',res)
    }).catch((err) => {
      console.log(err)
    })
  },
})

异步实现 async、await

onLoad: async function (options) {
    let params = {
      cityid:1,
      communityid:200013141
    }
    await list(params).then(res => {
      if(res.statusCode == '200'){
        if(res.data.status == '200'){
          console.log('res',res)
        }
      }else{
        console.log(res.data.msg)
      }
    })

}

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

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

相关文章

JAVA 常用类型之String结构

String在java中我们是用来操作字符串的,但它的底层结构确是一个char[]数组,通过数组的方式将每个字符进行保存。 使用时:String str"ABCD",内部存value确是:value[A,B,C,D]; 如下图: 参考String源…

七大排序算法的多语言代码实现

文章目录 前言 一、排序算法 1.原理简述 2.分类与复杂度 二、实例代码 1.冒泡排序 C Python Java Golang Rust Dephi 2.选择排序 C Python Java Golang Rust Dephi 3.插入排序 C Python Java Golang Rust Dephi 4.希尔排序 ​编辑 C Python Java Gola…

Linux网络技术学习(五)—— 网络设备初始化(I)

文章目录什么时候进行的设备初始化?设备注册和初始化NIC(网卡 Network Interface Card)初始化的基本目标设备与内核之间的交互硬件中断中断类型传送节流方式为了改善效率中断共享IRQ处理函数映射的组织irqaction结构体存储方式什么时候进行的…

android fwk模块之Sensor架构

本文基于Android 12源码整理,包含如下内容: 通信架构应用层实现使用方式SensorManager抽象接口具体实现fwk层的实现native中的SensorManager的初始化流程native中的消息队列初始化与数据读取sensorservice实现HAL层的实现通信架构 应用层实现 涉及代码&…

C#开发的OpenRA的只读字典IReadOnlyDictionary实现

C#开发的OpenRA的只读字典IReadOnlyDictionary实现 怎么样实现一个只读字典? 这是一个高级的实现方式,一般情况下,开发人员不会考虑这个问题的。 毕竟代码里,只要小心地使用,还是不会出问题的。 但是如果在一个大型的代码,或者要求比较严格的代码里,就需要考虑这个问题了…

51单片机——中断系统之外部中断实验,小白讲解,相互学习

中断介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学些单片机必须要掌握的。 为了更容易的理解中断概念&…

1.3配置P2P网络类型

1.3.1实验3:配置P2P网络类型 实验需求实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型实验拓扑实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤步骤1:[1] 配置IP地址 路由器R1

关于“档案大数据”的非主流看法

近日,反复拜读了前国家档案局局长杨冬权先生今年6.9档案日的大作《从“选时代”到“全时代”——智慧社会档案工作的历史性转折》,作为档案信息化从业者那真是倍感振奋,壮怀激烈! 这篇文章绝对可以用气势磅礴、高屋建瓴这样的词语…

Oracle Data Guard 角色转换(Role Transitions)

查询视图V$DATABASE的DATABASE_ROLE列可以看到数据库当前的角色。 1.角色转换介绍 Oracle Data Guard让你可以使用SQL语句或者通过Oracle Data Guard broker界面来动态更改数据库的角色,Oracle Data Guard支持以下的角色转换: 1&#xff0…

C语言——指针、数组的经典笔试题目

文章目录前言1.一维数组2.字符数组3.二维数组4.经典指针试题前言 1、数组名通常表示首元素地址,sizeof(数组名)和&数组名两种情况下,数组名表示整个数组。 2、地址在内存中唯一标识一块空间,大小是4/8字节。32位平台4字节,64位…

hive数据存储格式

1、Hive存储数据的格式如下: 存储数据格式存储形式TEXTFILE行式存储SEQUENCEFILE行式存储ORC列式存储PARQUET列式存储 2、行式存储和列式存储 解释: 1、上图左面为逻辑表;右面第一个为行式存储,第二个温列式存储; …

【C语言】程序环境和预处理|预处理详解|定义宏(上)

主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、程序的翻译环境和执行环境 二、详解编译和链接 1.翻译环境 2.编…

TCP协议十大特性

日升时奋斗,日落时自省 目录 1、确认应答 1.1、序号编辑 2、超时重传 3、连接管理 3.1、三次握手 3.2、四次挥手 4、滑动窗口 5、流量控制 6、拥塞控制 7、延时应答 8、捎带应答 9、面向字节流 10、异常情况 TCP协议: 特点:有…

浅析EasyCVR安防视频能力在智慧小区建设场景中的应用及意义

一、行业需求 城市的发展创造了大量工作机会,人口的聚集也推动了居民住宅建设率的增长。人民生活旨在安居乐业,能否住得“踏实”是很多劳动工作者最关心的问题。但目前随着住宅小区规模的不断扩大、人口逐渐密集,在保证居住环境舒适整洁的同…

C++入门:初识类和对象

C入门:类和对象1 本节目录C入门:类和对象11.auto关键字(C11)1.1类型别名思考1.2auto简介typeid运算符:获取类型信息1.3 auto的使用细则1.4auto不能推到的场景2.基于范围的for循环(C11)2.1范围for的语法2.2范围for的使用条件3.指针…

SpringCloud篇——什么是SpringCloud、有什么优缺点、学习顺序是什么

文章目录一、首先看官方解释二、Spring Cloud 的项目的位置三、Spring Cloud的子项目四、Spring Cloud 现状五、spring cloud 优缺点六、Spring Cloud 和 Dubbo 对比七、Spring Cloud 学习路线一、首先看官方解释 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式…

【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps(5)- 标准和使用量类型的区别 前言 Logic Apps 和 ADF 的搭配使用是常见的组合,它们可以互相弥补各自的不足和…

opencv绘制椭圆

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

ViT自适应patch划分 ACM MM 2021

Transformer在计算机视觉方面取得了巨大的成功,而如何分割图像中的patch仍然是一个问题。现有的方法通常使用固定大小的patch embedding,这可能会破坏对象的语义。为了解决这一问题,作者提出了一种新的Deformable Patch模块(DPT&a…

CPP2022-30-期末模拟测试03

6-1 引用作函数形参交换两个整数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 设计一个void类型的函数Swap&#xff0c;该函数有两个引用类型的参数&#xff0c;函数功能为实现两个整数交换的操作。 裁判测试程序样例&#xff1a; #include <…