uni-app使用fly封装网络请求接口

介绍

本文采用uni-app框架开发,使用flyio库封装请求。

小程序里 wx.request 回调套回调,登录拿 code、带 token、统一弹错误,很快写成一团。flyio 接口接近 axios,拦截器能把公共逻辑抽出去。下面是我当时项目的拆法。

安装方式

项目根目录执行(HBuilderX 创建的 uni-app 一般也有 package.json):

npm install --save flyio

引入方式

新建api.js文件,编写以下内容

微信小程序端要用 dist/npm/wx 这条路径,直接 require('flyio') 有时会打到 H5 实现:

var Fly = require("flyio/dist/npm/wx")
var fly = new Fly;

配置方式

baseURL 换成你自己的域名;开发阶段记得在微信后台配合法 request 域名,否则真机必挂。

// 配置请求根域名
fly.config.baseURL = "http://whisper.wezoz.com"

// 配置响应拦截器
fly.interceptors.response.use(
	(response) => {
			// 如果请求报错
			if (response.data.code != 10000) {
				uni.showModal({
					title:'温馨提示',
					content:response.data.data
				})
			}else{
				//只将请求结果的data字段返回
				return response.data.data
			}
		},
		(err) => {
			//发生网络错误后会走到这里
			return Promise.resolve("网络请求:ERROR!")
		}
)

// 配置请求拦截器
fly.interceptors.request.use((request) => {
	request.headers["token"] = uni.getStorageSync('token');
	return request;
})

响应拦截里用 code != 10000 判业务失败,要和后端约定一致;网络错误分支我当年直接 resolve 了字符串,调用方不好区分成功失败,生产环境建议 reject 或统一返回 { ok: false }。请求拦截从 uni.getStorageSync 取 token,登录前发请求会是空 token,登录接口本身别走这套校验。

同步封装微信登录

wx.login 是异步的,包成 Promise 才能在 async/await 里顺序写「先 code、再换 token」:

async function wxLogin() {
	return await new Promise((resolve, reject) => {
		wx.login({
			success(res) {
				if (res.code) {
					resolve(res.code)
				}
			}
		})
	})
}

写一个接口如login

// 登录
export const login = async (params) => {
	console.log('开始登录...')
	let code = await wxLogin();
	let res = await fly.get('/user/login', {code: code})
	uni.setStorageSync('token', res.token)
	uni.setStorageSync('openid', res.openid)
}

封装普通请求

业务接口按资源拆文件导出即可,页面里只调 this.$api.xxx

export const updateUserInfo = (params) => {
	return fly.get('/user/update', params)
}

引入方式

App.vue 或者main.js添加以下代码

挂到 Vue.prototype.$api 后,任意页面都能 this.$api.login(),不用每个页面 import

import * as API from './static/utils/api'
Vue.prototype.$api = API

调用方式

test.vue

页面 onLoad 或按钮里直接调;登录建议放 App.vueonLaunch,避免每个页重复登录:

this.$api.login()

小结:网络层就三块——实例 + 拦截器 + 按接口导出。后面换域名、改 token 字段,只动 api.js 一处。

版权声明: 本文首发于 指尖魔法屋-uni-app使用fly封装网络请求接口https://blog.thinkmoon.cn/post/306-wechat-miniprogram-guide-network-api/) 转载或引用必须申明原指尖魔法屋来源及源地址!