uniapp网络请求封装

<script>
// 封装请求函数
	let ajaxTimes = 0;
	export default {
		globalData: {
			//全局开发者服务器接口地址,一般有开发地址以及生产地址,接口地址有多个可以切换使用              
			     requesturl: 'http://xxx.xxx.x.xxx:xxxx',
			  // requesturl: 'http://xx.xxx.xxx.xx/prod-api/',


			//假数据模拟接口
			// requesturl: 'https://mock.apipost.cn/app/mock/project/xxx/',

			/**发起网络请求。
			 * @param {开发者服务器接口地址} url
			 * @param {请求的参数} data
			 * @param {必须大写,有效值在不同平台差异说明不同} method
			 * @param {收到开发者服务器成功返回的回调函数} callback
			 */
			// 全局请求函数
			global_request: (url, data, method, flag) => {
			// 保存当前this
				let that = this;
				// 配置请求头
				var header = {
					'Content-Type': flag ? 'application/x-www-form-urlencoded' : 'application/json'
				};
				// 如果从本地存储得到有token,请求的时候加上token
				if (uni.getStorageSync('wxuser')) {
					//! 请求参数加入token值
					header.authorization = uni.getStorageSync('wxuser').token.access_token;
				}

				ajaxTimes++;
				// 显示加载中 效果
				uni.showLoading({
					title: "加载中",
				});
				/**
				 * 使用Promise的方式解决回调问题
				 * 调用这个函数后返回一个promise
				 * resolve方法接收成功回调
				 * reject方法接收错误
				 * 在外部可以使用调用时 可使用async await
				 * */
				return new Promise((resolve, reject) => {
					// 使用uniapp自带的请求函数
					uni.request({
						// 判断url的地址是否含有:引号,如果有就是有http://xxxxx的地址使用这个地址,如果没有就是这里配置的基础地址加上传输过来的地址拼接
						url: url.split(':')[0] == 'http' ? url : getApp().globalData.requesturl + url,
						// 传输的data
						data: data,
						// 头信息
						header: header,
						// 传输的方法
						method: method,
						// 解析传输回来的json格式为对象形式
						dataType: 'json',
						// 调用请求成功回调
						success: function(res) {
							if (res.data.code == 200) {
								resolve(res);
							} else if (res.data.code == 401) {
								uni.showToast({
									title: '登录已过期,请重新登录',
									icon: 'none',
									duration: 2000,
									success: function(res) {
										// 移除token
										uni.removeStorageSync('wxuser');
									}
								});
								setTimeout(() => {
									// 延时1s跳转到登录页面
									uni.navigateTo({
										url: '/subPackages/login/newPage'
									});
								}, 1000);
							} else if (res.data.code == 500) {
								uni.showToast({
									title: '服务器错误',
									icon: 'none',
									duration: 2000
								});
							} else {
								// 如果状态码不为200,400,500,调用global_Toast函数报错
								getApp().globalData.global_Toast(true, res.data.msg, function(
								res) {});
							}
						},
						// 请求失败回调
						fail: function(err) {
							uni.showToast({
								title: '网络错误,请稍后再试',
								icon: 'none',
								duration: 2000
							});
						},
						// 完成请求回调
						complete: () => {
							ajaxTimes--;
							if (ajaxTimes === 0) {
								//  关闭正在等待的图标
								uni.hideLoading();
							}
						}
					});
				});
			},

			/**保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。
			 * @param {需要跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2',path为下一个页面的路径,下一个页面的onLoad函数可得到传递的参数} url
			 * @param {接口调用成功的回调函数} callback
			 */
			global_navigateTo: function(url, callback) {
				uni.navigateTo({
					url: url,
					success: function(res) {
						callback(res);
					}
				});
			},

			/**显示/隐藏消息提示框
			 * @param {flag:显示消息提示框 !flag:隐藏消息提示框} flag
			 * @param {提示的内容,长度与 icon 取值有关} title
			 * @param {接口调用成功的回调函数} callbcak
			 */
			global_Toast: function(flag, title, callbcak) {
				if (flag) {
					uni.showToast({
						title: title,
						icon: 'none',
						duration: 5000,
						success: function(res) {
							callbcak(res);
						}
					});
				} else {
					uni.hideToast();
				}
			}
		}
	};
</script>

在app.vue当中封装上面的那段代码

我们可以创建一个专门存放api的文件夹,文件夹当中可以存放多个文件夹来存放各个模块的请求接口

例我们创建一个netowork或者api文件夹,文件夹当中创建一个login文件夹,文件夹再存放login.js文件存放接口

/**
 * ! 用户的登陆接口 以及注册接口
 */
// 引入app组件当中封装的网络请求接口函数
const {
    global_request
} = getApp().globalData;

/**
 * 用户登录
 * @param {openid}   
 */
// 参数携带在路径身上
const loginByAuth = (openid) => {
    return global_request('/xxx/xxx/xxxx/' + openid, null, 'GET');
}

 /**
   * 用户注册接口
    */
// 参数为data
const register = (data) => {
    return global_request('/xxxx/xxxx/xxxxx', data, 'POST');
}
// 暴露接口
module.exports = {
    loginByAuth,
    register,
}

组件调用接口发起网络请求

<script>
import {
		loginByAuth
} from '../../network/login/login.js';
export default {
		data() {
			return {
                 openid : 'xxx'
    
           }
		},
		methods: {
        //使用接口
       async login(){
            let res = await loginByAuth(openid);
       } 

}

}
</script>

关于app.vue的globaldata说明https://uniapp.dcloud.net.cn/collocation/App.html#globaldata

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp封装请求API的方法可以参考以下步骤: 1. 首先,在项目中新建一个http.js文件,可以放在api文件夹下。在该文件中,可以导入接口的前缀地址,例如baseURL。然后,定义一个myRequest方法,该方法接收一个options参数,并返回一个Promise对象。在该方法中,可以使用uni.request方法发送请求,设置请求的url、method、data、header等参数。在请求成功时,可以关闭Loading,判断返回的数据是否符合预期,如果不符合则使用uni.showToast方法提示获取数据失败,如果符合则使用resolve方法返回数据。在请求失败时,可以使用reject方法返回错误信息。最后,记得在请求开始时显示Loading,请求结束时隐藏Loading。[1] 2. 接下来,在http文件夹下新建一个request.js文件。在该文件中,可以定义一个全局请求封装方法。首先,设置请求的基础地址,例如base_url。然后,根据请求方法或URL来判断是否添加请求头,例如根据method是否为"post"来设置header中的token和content-type。接着,使用uni.request方法发送请求,设置请求的url、method、header、data等参数。在请求成功时,根据返回的状态码进行相应的操作,例如判断Errcode是否为'0',如果是则使用resolve方法返回数据,如果不是则使用uni.clearStorageSync方法清除本地缓存,并使用uni.showToast方法提示获取失败,并跳转到登录页面。在请求失败时,使用reject方法返回错误信息。最后,记得在请求开始时显示Loading,请求结束时隐藏Loading。[2] 3. 最后,在main.js文件中,可以将封装请求API导入并挂载到Vue的原型上,以便在页面中使用。首先,导入封装请求API,例如api。然后,使用Vue.prototype将api挂载到Vue的原型上,这样在页面中就可以通过this.api来调用封装请求方法。[3] 通过以上步骤,你就可以在uniapp封装请求API,并在页面中使用了。在页面中,可以通过调用this.api的方法来发送请求,例如this.api.GetSceneData()。[1][2][3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值