uni-app的网络请求库封装及使用(同时支持微信小程序)

其实uni-app中内置的uni.request()已经很强大了,简单且好用。为了让其更好用,同时支持拦截器,支持Promise 写法,特对其进行封装。同时支持H5和小程序环境,更好用啦。文中给出使用示例,可以看到使用变得如此简单。在此分享给有需要的小伙伴,需要的可以点击收藏。

前言

在uni-app中,常见的网络库主要是基于uni-app内置的uni.request()方法,这是一个统一的网络请求接口,支持HTTP和HTTPS协议,可以处理GET、POST等请求方法。这个API提供了基本的HTTP请求功能,可以满足大部分应用的网络通信需求。除此之外,由于uni-app是基于Vue.js的,所以也可以使用一些适用于前端的JavaScript网络库如axios 第三方库,支持Promise API,有丰富的拦截器、配置选项和错误处理。

为了兼容uni-app生态和微信小程序,推荐使用uni-app内置的uni.request()。

原因有以下几点:

集成性:uni.request()是uni-app框架的一部分,与uni-app的其他组件和服务紧密集成,使用起来更加方便,不需要额外安装和配置。

兼容性:uni.request()已经为uni-app的不同平台(包括iOS、Android、H5等)做了优化和适配,可以直接使用,而不需要担心跨平台兼容性问题。

简单易用:uni.request()的API设计简洁,易于理解和使用,对于大多数常规的网络请求任务,它提供了足够的功能。

性能:由于是原生实现,uni.request()通常会有更好的性能表现,特别是在处理数据量较大或需要高效网络交互的场景。

维护成本:使用uni.request(),开发者可以专注于业务逻辑,而不需要关注网络库的更新和维护。

如果你的项目中已经大量使用了axios,或者你需要利用axios提供的特定功能(如拦截器、取消请求、超时重试等),那么可以考虑继续使用axios。但需要注意的是,axios在uni-app中可能需要进行一些适配工作,尤其是小程序端。

网络库封装

原始的uni.request使用,举例如下:

methods(){getSwiperList() {  //方法名uni.request({url: "你的数据接口",success: (res) => { //如果成功了// 打印数据console.log(res);// 如果请求成功,就把数据转存起来,方便页面使用this.swipeList = res.data.message; },fail: (res) => {console.log('请求失败');}})}
}

可以看出,虽然简单,但是不封装一下还是不够简洁。尤其是不支持Promise写法。

原生态写法太过于繁琐。假如我们一个项目有多个接口,那我们每一个接口,就要写一个uni.request({})方法,而每个方法就要包含url、data、method、header,等等,这样代码很明显就变得多而杂。而用了Promise写法,在编写代码时,我们就可以使用async和await写法来简化请求接口代码了。

封装后的使用,可以看出多么简单,示例如下:

// api.js 获取当前正在热映电影
export const getNowHot = async (start,count,city) => {try {console.log('getNowHot request');const response = await uni.$http.post('/movie/in_theaters',{apikey: uni.$apiKey,city:city,start:start,count:count});console.log(response);if (response.statusCode !== 200) {uni.showToast({title: '数据请求失败! ',duration: 1500,icon: 'none',});return [];}return response.data;} catch (error) {console.error('Network request failed:', error);uni.showToast({title: '网络请求失败! ',duration: 1500,icon: 'none',});return [];}
};//index.vue 接口调用
mounted() {console.log("mounted")//轮播图接口调用getSwiperList().then(item => {this.swiperList = item;});//获取豆瓣top250getTop250(0,5).then(item => {//this.swiperList = item;});// 获取最近热播getNowHot(0,2,"郑州").then(result => {//this.swiperList = item;console.log("getNowHot,result:");console.log(result);});}

上述示例为使用豆瓣影视的接口,获取郑州正在热映的电影。豆瓣接口curl测试如下:

curl --location --request POST 'https://api.douban.com/v2/movie/in_theaters?start=0&count=1' --data-urlencode 'apikey=xxxxxxxxx'

接口封装

//utils/http.js
class Request {constructor(options = {}) {// 请求的根路径this.baseUrl = options.baseUrl || ''// 请求的 url 地址this.url = options.url || ''// 请求方式this.method = 'GET'// 请求的参数对象this.data = null// header 请求头this.header = options.header || {}this.beforeRequest = nullthis.afterRequest = null}// 添加对header的支持_mergeHeaders(customHeader = {}) {return Object.assign({}, this.header, customHeader); // 合并默认header和自定义header}get(url, data = {}) {this.method = 'GET'this.url = this.baseUrl + urlthis.data = datareturn this._()}post(url, data = {},header = {}) {this.method = 'POST'this.url = this.baseUrl + urlthis.data = datathis.header = this._mergeHeaders(header) // 合并headerreturn this._()}put(url, data = {}) {this.method = 'PUT'this.url = this.baseUrl + urlthis.data = datareturn this._()}delete(url, data = {}) {this.method = 'DELETE'this.url = this.baseUrl + urlthis.data = datareturn this._()}_() {// 清空 header 对象this.header = {}// 请求之前做一些事this.beforeRequest && typeof this.beforeRequest === 'function' && this.beforeRequest(this)// 发起请求return new Promise((resolve, reject) => {let weixin = wx// 适配 uniappif ('undefined' !== typeof uni) {weixin = uni}weixin.request({url: this.url,method: this.method,data: this.data,header: this.header,success: (res) => { resolve(res) },fail: (err) => { reject(err) },complete: (res) => {// 请求完成以后做一些事情this.afterRequest && typeof this.afterRequest === 'function' && this.afterRequest(res)}})})}
}export const $http = new Request()

如何使用

在main.js中引入该模块封装,并将其挂在全局的uni.$http上即可。如下:

import App from './App'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({...App
})
app.$mount()
// #endif// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {const app = createSSRApp(App)return {app}
}
// #endifimport { $http } from './utils/http.js'
uni.$http = $http
// 配置请求根路径
$http.baseUrl = 'https://api.douban.com/v2'
uni.$apiKey = 'xxxxxxxxx'
// 请求开始之前做一些事情
$http.beforeRequest = function (options) {uni.showLoading({title: '数据加载中...',})
}// 请求完成之后做一些事情
$http.afterRequest = function () {uni.hideLoading()
}

在其他文件夹,如api文件夹下,可以愉快的写接口啦,举例如下:

// api/home.jsexport const getSwiperList = async () => {try {console.log('getSwiperList request');const response = await uni.$http.get('/api/v1/home/swiperdata');console.log(response.data.list);if (response.statusCode !== 200) {uni.showToast({title: '数据请求失败! ',duration: 1500,icon: 'none',});return [];}return response.data.list;} catch (error) {console.error('Network request failed:', error);uni.showToast({title: '网络请求失败! ',duration: 1500,icon: 'none',});return [];}
};export const getTop250 = async (start,count) => {try {console.log('getTop250 request');const response = await uni.$http.post('/movie/top250', {apikey: uni.$apiKey,start:start,count:count},{'Content-Type': 'application/x-www-form-urlencoded'});console.log(response);if (response.statusCode !== 200) {uni.showToast({title: '数据请求失败! ',duration: 1500,icon: 'none',});return [];}return response.data.list;} catch (error) {console.error('Network request failed:', error);uni.showToast({title: '网络请求失败! ',duration: 1500,icon: 'none',});return [];}
};// 获取当前正在热映电影
export const getNowHot = async (start,count,city) => {try {console.log('getNowHot request');const response = await uni.$http.post('/movie/in_theaters',{apikey: uni.$apiKey,city:city,start:start,count:count});console.log(response);if (response.statusCode !== 200) {uni.showToast({title: '数据请求失败! ',duration: 1500,icon: 'none',});return [];}return response.data;} catch (error) {console.error('Network request failed:', error);uni.showToast({title: '网络请求失败! ',duration: 1500,icon: 'none',});return [];}
};

写在最后

最后,附上完整的工程项目模版。为了更通用,这个是从我的业余项目(爱看电影app小程序) 中抽离出来的工程模版和示例。带网络库的封装和可用的豆瓣影视接口封装,以及个人中心页面。可以作为工程模版或小项目练手,分享给有需要的小伙伴。

资源下载地址:

https://download.csdn.net/download/qq8864/89377440

其他资源

豆瓣接口API使用_热映电影api接口怎么用-CSDN博客

https://feizhaojun.com/?p=3813

Movie API Doc | doubanapi

uniapp 请求解决跨域问题_uniapp跨域请求-CSDN博客

豆瓣API常用api总结实例_douban api-CSDN博客

组件使用的入门教程 | uni-app官网

微信小程序 --- wx.request网络请求封装-CSDN博客

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

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

相关文章

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查,只不过加入了类的概念。 为了防止与std里面的string冲突,所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

Unity【入门】脚本基础

Unity脚本基础 文章目录 1、脚本基本规则1、创建规则2、MonoBehavior基类3、不继承MonoBehavior的类4、执行的先后顺序5、默认脚本内容 2、生命周期函数1、概念2、生命周期函数有哪些3、生命周期函数支持继承多态 3、Inspector窗口可编辑的变量4、Mono中的重要内容1、重要成员2…

冯喜运:5.31晚间黄金原油行情分析及尾盘操作策略

【黄金消息面分析】:周五(5月31日),最新发布的数据显示,美国4月核心PCE物价指数月率录得0.2%,低于预期(0.3%),经济学家认为,核心指数比整体指数更能反映通胀。除此之外,美…

HackTheBox-Machines--Sense

Popcorn 测试过程 1 信息收集 服务器开启80、443端口 80端口 访问 80 跳转到 443 – https://10.129.196.51/ ,该页面是 pfSense 登录界面,默认密码是: admin/pfSense,使用默认账号密码登录失败 目录扫描 ./gobuster dir -u htt…

深度神经网络——什么是线性回归?

线性回归是一种用于预测或可视化的算法 两个不同特征/变量之间的关系。 在线性回归任务中,要检查两种变量: 因变量和自变量。 自变量是独立的变量,不受其他变量的影响。 随着自变量的调整,因变量的水平将会波动。 因变量是正在研究…

三体中的冯诺依曼

你叫冯诺依曼,是一位科学家。你无法形容眼前的现态,你不知道下一次自己葬身火海会是多久,你也不知道会不会下一秒就会被冰封,你唯一知道的,就是自己那寥寥无几的科学知识,你可能会抱着他们终身,…

《QT实用小工具·六十九》基于QT开发的五子棋AI游戏

1、概述 源码放在文章末尾 该项目实现了五子棋对战AI,可以享受和AI下棋的快乐,项目实现思路如下: 博弈树 ●Alpha-Beta剪枝(性能提高较大) ●启发式搜索(性能提高较大) ●落子区域限制(性能提高较大) ●Zobrist哈希(性能小幅提升) ●Qt…

数据治理基础知识

文章目录 基本概念相关名词术语数据治理对象 基本概念 1)从管理者视角看数据治理 数据治理是企业发展战略的组成部分,是指导整个集团进行数字化变革的基石,要将数据治理纳入企业的顶 层规划,各分/子公司、各业务部门都需要按照企…

软考高级系统规划与管理师适合什么人考?有什么优势?

系统规划与管理师适合什么人考? 适合以下几类人群: 1. 信息技术服务规划人员:从事信息技术服务规划工作,负责制定和优化IT服务规划的人 2. 信息系统运行维护管理人员:负责信息系统日常运行维护、确保系统稳定性和可…

【前端】Mac安装node14教程

在macOS上安装Node.js版本14.x的步骤如下: 打开终端。 使用Node Version Manager (nvm)安装Node.js。如果你还没有安装nvm,可以使用以下命令安装: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 然后关…

变压器励磁涌流MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 变压器励磁涌流的产生机理 1、变压器是电力系统的关键部分,在实际的 运行中,变压器需要进行相应的充电,而在充电的过 程中,就需要进行开合闸作业。在开合闸作业…

【Linux】磁盘结构文件系统软硬链接动静态库

目录 一.磁盘结构 1、磁盘的物理结构 2、磁盘的存储结构 3、磁盘的逻辑结构 二.文件系统 1、对IO单位的优化 2、磁盘分区与分组 3、对分组的具体管理方法 4、文件操作 三.软硬链接 1、理解硬链接 2、理解软连接 3、理解.和.. 四、动静态库 1、什么是动静态库 2、…

Flutter基础 -- Dart 语言 -- 基础类型

目录 0. 配置 1. 变量 1.1 弱类型 var Object dynamic 1.2 强类型 1.3 使用场景 var 简化定义变量 查询参数定义 返回的实例对象 2. 常量 final 和 const 2.1 相同点 类型声明可以省略 初始后不能再赋值 不能和 var 同时使用 2.2 不同点 const 需要确定的值 …

线性代数|机器学习-P1课程简介

文章目录 1. 书籍下载2. 正文 1. 书籍下载 链接:https://pan.baidu.com/s/1QbK0enLh0x4nU1c4Tqwlkw 提取码:r7ft 本课程回顾线性代数在概率论、统计学、优化和深度学习中的应用。是GILBERT STRANG教授的有一个经典的课程。课程将线性代数分为如下部分&a…

利用“记忆化搜索“解斐波那契数

一、题目描述 求第 n 个斐波那契数。 二、 利用"记忆化搜索"解斐波那契数 什么是记忆化搜索?记忆化搜索就是带有备忘录的递归。 我们先来看一下使用递归来解斐波那契数的这个过程,假设求第5个斐波那契数F(5)。 由图可见,要重复计…

Android加固多渠道打包和签名工具

简介 基于腾讯VasDolly最新版本3.0.6的图形界面衍生版本,同时增加了签名功能,旨在更好的帮助开发者构建多渠道包 使用说明 下载并解压最新工具包,找到Startup脚本并双击启动图形界面(注意:需本地安装java环境&#…

手机定制开发_基于天玑900的5G安卓手机定制方案

手机定制方案基于联发科天玑900强劲旗舰八核2.4GHz处理器。这款处理器采用了6nm先进制程工艺,为用户带来了痛快淋漓的性能体验。不论是进行游戏还是日常娱乐,用户都能轻松驾驭。手机搭载了最新的Android 13操作系统,提高了数据读取的准确性&a…

小数第n位【蓝桥杯】

小数第n位 模拟 思路&#xff1a;arr数组用来记录已经出现过的a&#xff0c;在循环时及时退出。易知题目的3位即a%a后的第n-1,n,n1位。该代码非常巧妙&#xff0c;num记录3位的输出状况。 #include<iostream> #include<map> using namespace std; typedef long l…

vulnhub靶场之FunBox-9

一.环境搭建 1.靶场描述 Its a box for beginners, but not easy. Gather careful !!! Hint: Dont waste your time ! Every BruteForce-Attack at all ports can be stopped after 1500 trys per account. Enjoy the game and WYSIWYG ! This works better with VirtualBox…

博士毕业论文/CTEX/LATEX

LATEX环境安装 CTEX 安装 &#xff08;垃圾&#xff0c;不要装&#xff09; 运行 clean.batcomp.bat 缺少字体 Couldn’t find Adobe Heiti S.cfg’ miktex-maketfm: No creation rule for font “Adobe Heiti Std”.解决方法&#xff1a;其实就是下载这四个字体之后&…