uni-app如何封装公共HTTP请求方法

前端开发是离不开HTTP请求的,在uni-app中,是如何发送HTTP请求的呢?

官方其实提供了一个 uni.request(OBJECT) 方法,然而,uni.request 的问题太大了,给我的感觉还像是jq时代去发送HTTP请求的用法,比如:

  • 代码冗余:每次发起请求时都需要编写类似的配置代码,导致代码重复。
  • 缺乏统一管理:没有统一的地方管理请求参数、头信息、错误处理等,使得代码不易维护。

像我们现在经常用的axios,提供了请求拦截器和响应拦截器,而且是 Promise 的调用方式,这让我们用起来非常舒服,那怎么把 uni.request 封装成这种方式呢?

/**
 * 通用接口请求
 */

import { getToken } from '@/utils/token.js'

// 定义返回状态码,这个应该单独写一个文件
const code = {
	codeOK: '0',
	codeNoMobile: '-122',
	codeUnLogin: '10086',
	codeBan: '10087',
}
// 定义网络请求公共地址
const network = {
	baseUrl: 'https://api.com'
}

// 定义公共请求参数
const defaultConfig = {
	timeout: 5000,
	dataType: "json",
	header: {
	  "content-type": "application/json",
		'Authorization': getToken()
	}
}

const request = (options = {}) => {
	return new Promise((resolve, reject) => {
		// 发送请求
		uni.request({
			...defaultConfig,
			...options,
			url: network.baseUrl + options.url || '',
			header: {
				...defaultConfig.header,
				...options.header
			}
		}).then(resp => {
			if (resp.data.code == code.codeUnLogin) {
				uni.navigateTo({
					url: '/pages/login/index'
				}, false)
			} else if (resp.data.code == code.codeBan) {
				uni.navigateTo({
					url: '/pages/index/ban?banReason=' + resp.data.msg
				})
			}
			resolve(resp.data);
		}).catch(error => {
			reject(error);
		})
	})
}

export default request

这样我们就对uni.request进行了Promise封装,这里主要是提供一个思路,具体的你还要根据自己的情况也业务进行封装,看一下使用方法:

import request from '@/utils/request.js'

export function getAddressListApi(data) {
	return request({
		url: '/union/productAddr/findAll',
		method: 'get',
		data
	})
} 

这样使用是不是舒服多了,有的人在这里可能会有疑问,既然已经封装了request,为什么还要把每个请求再封装一次,这就涉及到代码封装的思想问题了,同样的代码不能出现两遍。比如你在连个地方调用了这个接口,有一天后端接口地址改了,你怎么做,是不是还得全局搜索,是不是出错的概率就高了,这样封装你只需要改这一个地方。

同样的逻辑,比如返回的状态码codeOK,这种都应该放在一个统一的地方进行管理,虽然说大概率没人去改这个,但是万一呢?全局去搜索吗,搜索0可不好搜。

从代码的封装性来说就不能这么干,否则你总会有吃亏那一天的,我刚开始写代码的时候也不会这样写,吃过亏才会长教训。

封装起来有两个明显的好处:

  • 高度可改性:这个状态码的值你想怎么改就怎么改,对我的业务逻辑都没有影响,而且我改起来非常快,同样是搬砖的有时候差距就在这,你觉得我要改半天,我其实1s就改好了;
  • 提高可读性:如果你是一个新接手这个代码的人,res.code == '0' 和 res.code == codeOK,自己体会一下,谁能看懂等于'0'是什么意思;

还有一种封装思路,就是使用 uni.addInterceptor 这个官方提高的拦截器对request方法进行拦截,这样可以做到添加token的处理公共返回结果,但是我觉得还是用Promise的方式使用更舒服,见仁见智吧,都可以。

### 关于uni-app方法列表及用法 #### 一、基础配置与初始化 uni-app基于Vue语法构建,因此其大部分API遵循Vue的标准。对于项目创建和基本设置,在开始一个新的uni-app项目时,需安装HBuilderX IDE并利用内置模板快速搭建环境[^1]。 #### 二、页面生命周期函数 类似于微信小程序,uni-app也定义了一套完整的页面生命周期回调机制,允许开发者在不同阶段执行特定逻辑: - `onLoad`:当页面加载完成时触发; - `onShow`:每次打开页面都会被调用; - `onReady`:仅首次渲染完成后调用一次; - `onHide`:当前页面隐藏时触发; - `onUnload`:离开页面销毁前触发; 这些钩子可以用来处理数据预取、状态保存等功能。 #### 三、网络请求接口 为了简化HTTP通信过程,uni-app封装了一个轻量级的Ajax库——$http(),它支持GET/POST等多种方式发送异步请求,并返回Promise对象以便链式操作: ```javascript // 发送GET请求 uni.request({ url: 'https://example.com/api/data', method: 'GET', success(res){ console.log('成功:', res.data); }, fail(err){ console.error('失败:', err); } }); ``` 此部分功能适用于任何需要同服务器交互的应用场景。 #### 四、UI组件库集成 除了官方提供的标准控件外,还可以通过引入第三方插件来增强用户体验。比如实现获取验证码后的倒计时效果,可以通过自定义定时器配合button按钮的状态切换轻松达成目标[^2]: ```html <template> <view class="container"> <!-- 验证码输入框 --> <input type="text" v-model="code"/> <!-- 获取验证码按钮 --> <button @click="getCode()" :disabled="isCounting">{{ buttonText }}</button> </view> </template> <script> export default { data(){ return{ code:'', // 用户填写的验证码 isCounting:false, // 是否正在倒数中 countDownTime:60, // 倒数时间长度(秒) timer:null // 定时器ID }; }, methods:{ getCode(){ this.isCounting=true; let that=this; function startTimer(){ if(that.countDownTime<=0){ clearInterval(that.timer); that.buttonText='重新发送'; that.isCounting=false; that.countDownTime=60; }else{ that.buttonText=`${that.countDownTime}s`; that.countDownTime--; } } this.buttonText=`${this.countDownTime}s`; this.timer=setInterval(startTimer,1000); } } } </script> ``` 上述代码片段展示了如何结合业务需求设计实用的功能模块。 #### 五、原生能力扩展 针对某些特殊场合下可能涉及到的操作系统底层特性访问(如摄像头权限申请),则可通过JNI桥接技术让JS层能够间接调用Android系统的native API。具体做法是在Java侧暴露公共静态方法供外部调用,而在前端这边借助plus.android.importClass()动态加载所需类文件实例化后即可正常工作[^3]。 ```java public class MyNativeHelper extends JSBridgeBase { public static void doSomething(Context context) throws Exception { // 实现具体的本地逻辑... } } // 对应js端调用形式如下所示: var main = plus.android.runtimeMainActivity(); var helper = eval("new " + plus.android.importClass("com.example.MyNativeHelper")); helper.doSomething(main); ``` 以上就是有关uni-app常见方法及其应用场景的一些说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢滴哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值