【uni-app】uni.request封裝,更好的管理api接口和使用


前言

之前寫了一個Vue.js的axios封裝(點擊跳轉),這次是uni-app,uni-app是基於vue.js框架的,我覺得是很好用的一個框架,而且一套代碼編譯那么多平台,非常節省成本,當然,有好處肯定也有不好的地方,那就是坑。踩坑的地方很多(沒踩過坑肯定是沒有深入使用uni-app),如果有坑自己嘗試了而沒有辦法處理,建議添加官方QQ群或者到官方論壇提問或者搜索。這次的封裝跟axios沒多大區別,也是異步請求,但是這個是直接把uni-app的自帶API請求uni.request封裝。

封裝uni.request

在根目錄下建一個api文件夾,起一個request.js,放入下面代碼

const request = (config) => {
	// 處理 apiUrl
	config.url = '127.0.0.1/api' + config.url;
	if(!config.data){
		config.data = {};
	}
	console.log(JSON.stringify(config.data));
	let promise = new Promise(function(resolve, reject) {
		uni.request(config).then(responses => {
			// 異常
			if (responses[0]) {
				reject({message : "網絡超時"});
			} else {
				let response = responses[1].data; // 如果返回的結果是data.data的,嫌麻煩可以用這個,return res,這樣只返回一個data
				resolve(response);
			}
		}).catch(error => {
			reject(error);
		})
	})
	return promise;
};

export default request;

管理api

接下來繼續在api文件夾下面創建一個login.js文件(如果api接口分類不需要分開的話就創建index.js,全部放一塊,然后引入js,定義一個api,使用就以api.pwdlogin().then(res => {})方式)

PS:這里跟axios封裝方式不一樣,如果一個模塊有多個請求(比如登錄有密碼登錄,手機驗證碼登錄等等),可以用以下方式,方便管理

import request from '@/api/request'; // 引入封裝好的request

// 密碼登錄
function pwdLogin (data) {
	return request({
		method: "POST", // 請求方式
		url: 'login/pwd', // 請求url
		data: data // 參數
	})
}

// 手機登錄
function phoneLogin (data) {
	return request({
		method: "POST", // 請求方式
		url: 'login/phone', // 請求url
		data: data // 參數
	})
}

export default{
	pwdLogin,
	phoneLogin
}

使用api

import login from '@/api/login.js'; // 引入api

export default {
	data() {
		return {
			phone: '', // 手機號碼
			password: '', // 密碼
			code: '', // 手機驗證碼
			isPwdLogin: true // 是否使用密碼登錄
		}
	},
	onShow() {
		this.showInit();
	},
	methods: {
		
		// 初始化
		async showInit() {},

		// 登錄
		handleToLogin() {
			if (isPwdLogin) { // 使用密碼登錄
				let pwdParams = {
					phone: this.phone,
					password: this.password
				}
				login.pwdLogin(pwdParams).then(res => {
					if (res.code == 200) {
						uni.showToast({
							title: "登錄成功",
							icon: 'success'
						})
					}
				}).catch(err => {
					uni.showToast({
						title: err.msg,
						icon: 'none'
					})
				});
			} else { // 使用手機驗證碼登錄
				let phoneParams = {
					phone: this.phone,
					code: this.code
				}
				login.phoneLogin(phoneParams).then(res => {
					if (res.code === 200) {
						uni.showToast({
							title: "登錄成功",
							icon: 'success'
						});
					}
				}).catch(err => {
					uni.showToast({
						title: err.msg,
						icon: 'none'
					})
				});
			}
		}
	}
}

以上就是這篇uni.request封裝的所有內容了,看到這里的伙伴們如果有不明白的地方請留言哦,如果寫的不好也可以留言吐槽!!!

總結

跟axios封裝稍微有一點點變化,但是都很明顯的,這個封裝個人覺得是非常非常好用,然后就是uni-app的uni.request請求問題,這里要說明一下,如果遇到異步問題,請使用下面的方法:

import products from '@/api/products.js'

export default {
	data() {
		return {
			productsList: []
		}
	},
	onLoad() {
		this.showInit();
	},
	methods: {
		
		// 初始化
		async showInit() {
			await this.getProductsList();
		},

		// 獲取產品列表
		getProductsList() {
			products.list().then(res => {
				if (res.code == 200) {
					this.productsList = res.data;
				}
			}).catch(err => {
				uni.showToast({
					title: err.msg,
					icon: 'none'
				})
			});
		}
	}
}

這里用到了async + await,如果不明白這兩個語法的意思和用處,請看 阮一峰的ES6教程,這里就不明說了。

原文鏈接:https://blog.langting.top/archives/93.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM