uniapp Promise封装全局uni.request网络请求

前言:

在一个项目开发时,我们除了页面布局之外,就是数据处理了,封装一个全局的网络请求,有助于我们处理一些公用逻辑代码,更加专注于业务代码

官方api说明:

https://uniapp.dcloud.net.cn/api/request/request.html

一般我们只关注这几个参数

url 也就是我们的baseurl,根域名

header 为一个对象,请求的 header 中 content-type 默认为 application/json 一般不做处理,可能会根据后端添加 token校验参数

method 请求方式一般都常用 get post

成功回调和axios有所差异,axios只会默认状态码statusCode:200返回,其他的统统走失败回调

uni.request:

success回调这个是这篇文章的重点,为什么这么说呢,很多后端的小伙伴只会固定的思维去处理状态码,多人开发中,有些后端的同学会按照他们自己的习惯去定义请求状态码,我们只有把这里弄清楚了才会游刃有余的处理请求拦截

200 -500 只要是请求发送到服务器返回的状态码都走success回调

小伙伴这里可以自信测试下喔

弄懂了uni.request

我们就开始封装吧

Promise

Promise 是现代 JavaScript 中异步编程的基础。它是一个由异步函数返回的对象,可以指示操作当前所处的状态。在 Promise 返回给调用者的时候,操作往往还没有完成,但 Promise 对象提供了方法来处理操作最终的成功或失败。

说实在点,就是让异步处理请求在多个接口请求中实现同步,举例:设计网页开发中一个页面可能存在要请求多个接口,且会在第一个请求拿到数据之后才能请求第二个接口

封装代码:
创建文件server.js
const  geturl = ()=>{
	if (uni.getSystemInfoSync().platform !== "devtools") {
		// 线上环境
		const BASE_URL="xxx"; 
		return BASE_URL	
		
	}else{
		// 开发环境
		const BASE_URL="xxx"; 
		return BASE_URL
	}
}
export const myRequest=(options)=>{ 

    //传入的options是一个json对象
	
	return new Promise((resolve,reject)=>{

		// 添加登录验证
		let token = uni.getStorageSync("token");
		
		// 设置请求loading动画
		uni.showLoading({
			title:"加载中..."
		})
		let BASE_URL = geturl();
		// 发送请求
		uni.request({
			url:BASE_URL+options.url,
			method:options.methods||"GET",
			data:options.data || {},
			dataType:options.dataType || "json",
			header:{
				'content-type': 'application/x-www-form-urlencoded',
				'Authorization':token
			},
			
			// 请求成功回调
			success: (res) => {
				// console.log(res);//打印返回结果
				// 此处设置请求成功返回的状态码,并设置拦截其他状态码,统一给出响应提示  statusCode
				if(res.statusCode==200){

					switch (res.data.status){
						case 200:
						console.log("成功");
						uni.hideLoading();
						resolve(res.data)
							break;
						case 411:
						console.log("失败");
						uni.hideLoading();
						uni.showToast({
							icon:"none",
							title:res.data.msg
						})
							break;
						case 101:
						uni.hideLoading();
						console.log("请登录");
						    break;    
						default:
						uni.showToast({
							icon:'none',
							title:'服务器出错了'
						})
							break;
					}
					
					// 请求成功隐藏loading动画
					
				}else{
                    //返回其他类型的状态码
					let title = res.statusCode.toString()
					uni.hideLoading();
					uni.showToast({
						icon:"none",
						title:title,
						duration:2000
					})
					console.log(res.statusCode);
				}		
			},
			
			// 请求失败回调
			fail: (err) => { 
                
				uni.hideLoading();
				console.log(err,"错误信息");
				if(err.errMsg == "request:fail timeout"){
					uni.showToast({
						icon:"none",
						title:"网络请求超时,请重试!",
						duration:2000
					});
					return
				}
				uni.showToast({
					icon:"none",
					title:"网络连接失败,请重试!",
					duration:2000
				})
				reject(err)
			}
		})
	})
}

创建api接口文件 index.js

import {myRequest} from "../server.js"

// 实列请求模块

// 首页Banner

export  const banner = data=>{
	 return myRequest({url:'/api/banner',data:data,methods:"GET"});
}

 页面调用
import {banner} from "@/api/index.js";
onLoad() {
	this.getbanner()
},
methods: {
	async getbanner(){
		let {data:data} = await banner()
		this.banner = data
	},
}

我一直用这套封装,简洁明了,分享出来备作参考吧,有不懂的可以问我

在Vue框架中,若要将微信小程序的接口操作封装以便在UniApp中复用,可以使用UniApp提供的`uni.request`方法,它是一个基于Promise网络请求API。以下是基本的封装步骤以及涉及的响应拦截和设置请求头: 1. 引入uni.request: 首先,在Vue组件的script部分引入`uni`对象,它是 UniApp 的核心API之一。 ```javascript import { uni } from '@dcloudio/uni-app' ``` 2. 定义接口函数: 创建一个自定义函数,如`wxRequest`,接受请求配置对象作为参数,并返回一个Promise。 ```javascript export const wxRequest = async (config) => { try { return await uni.request(config); } catch (error) { // 处理错误,例如日志记录或通知用户 console.error('Network error:', error); throw new Error(error.message); // 或者根据需要抛出错误信息 } } ``` 3. 设置请求头: 在配置对象`config`中,你可以通过`headers`属性添加自定义的请求头。例如,设置"Content-Type"为JSON格式: ```javascript const headers = { 'Content-Type': 'application/json', }; const config = { url: 'https://your-api-url.com', // 将此处替换为实际的API地址 method: 'POST', // 请求方式 data: { key: 'value' }, // 发送的数据 headers, }; await wxRequest(config); ``` 4. 响应拦截: 虽然uni.request本身提供了一定程度的错误处理,但在全局范围内,你可能希望对所有请求都统一处理响应状态。可以通过Vue的生命周期钩子或Vuex的状态管理来实现。例如,可以在`created`或`mounted`阶段设置一个全局的响应拦截器: ```javascript export default { created() { uni.request.onShowLoading({ title: '加载中...', mask: true, success() { this.$store.dispatch('clearError')(); // 清除之前的错误 }, }); uni.request.onError((err) => { this.$store.commit('setError', err); // 存储错误并显示给用户 }); }, // ... }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值