一、封装前的准备
先在项目上起一个名为service的目录,里面放request和api两个js文件
二、封装第一步:request.js
js
const baseUrl = 'xxxx'
export const appid = 'xxx'
export const applet_id = 'xxx'
/**
* @description: 小程序https请求封装
* @return {*}
*/
class HttpRequest {
constructor(requestConfig, backendConfig) {
this.requestConfig = requestConfig
this.backendConfig = backendConfig
}
/**
* @description:
* @param {*} params
* @return {*}
*/
async request(options) {
const {
url,
data = {},
method = this.requestConfig.method,
dataType = this.requestConfig.dataType,
} = options
await checkSession()
const userInfo = my.getStorageSync({ key: 'userInfo' }).data
if (data.hasOwnProperty('user_id') && data.user_id === '') {
data.user_id = userInfo.user_id
}
return new Promise(async (resolve, reject) => {
my.request({
url: `${baseUrl}${url}`,
data,
method,
headers: {},
dataType,
success: (res) => {
// 后端接口返回的值,false为报错
if (!res.data.status) {
// 错误信息
resolve(res.data)
} else {
// 成功后的数据对象
resolve(res.data.data)
}
}
})
})
}
}
/**
* @description: 校验登陆态
*/
async function checkSession() {
const userInfo = my.getStorageSync({ key: 'userInfo' }).data
if (!userInfo) {
const res = await getCode()
my.setStorageSync({
key: 'userInfo',
data: res
})
} else {
if (appid !== userInfo.appid) {
const res = await getCode()
my.setStorageSync({
key: 'userInfo',
data: res
})
}
}
}
async function getCode() {
const { authCode } = await my.getAuthCode()
return new Promise((resolve) => {
my.request({
url: `${baseUrl}/getinfo`,
method: 'POST',
data: {
applet_id,
auth_code: authCode
},
success(res) {
resolve(res.data.data)
}
})
})
}
const defaultRequestConfig = {
headers: {
'content-type': 'application/json'
},
dataType: 'json',
method: 'POST'
}
export const myRequest = new HttpRequest(defaultRequestConfig, {
baseUrl,
codeKey: 'code',
dataKey: 'data',
successCode: 200,
})
2.1 接口在请求之前判断是否登录,如果未登录则先调用登录操作,把user_id记录在缓存里面,下次接口请求就不需要进行登录了,这里我用的是支付宝的开放接口,根据小伙伴的不同需要,可以改成微信小程序和uniapp。(wx.request和uni.request)
三、封装第二步:api.js
js
import { myRequest, applet_id, appid } from "./request";
const userInfo = my.getStorageSync({ key: 'userInfo' }).data || { appid: '', user_id: '' }
/**
* 首页数据获取
*/
export async function fetchBankcard() {
return myRequest.request({
url: '/bankcard',
data: {
applet_id,
user_id: userInfo.user_id
}
})
}
3.1 这里获取登录信息,如果没有则为空,然后会走request文件的逻辑,进行登陆,然后user_id会重新赋值