概括:
POST/GET:
利用http模块结合泛型方法进行统一的post/get请求封装
技术细节
// 所有接口返回数据的类型 export interface IResponseModel<T> { /** * 请求成功10000标志 */ code: number; /** * 返回数据 */ data: T; /** * 请求成功 */ message: string; /** * 请求成功标志 */ success: boolean; } /** * 返回数据 */ export interface iLoginDataModel { /** * 用户头像地址 */ avatar?: string; /** * 连续打卡天数 */ clockinNumbers: number; /** * 用户id */ id: string; /** * 昵称 */ nickName: string; /** * token过期后,刷新token使用 */ refreshToken: string; /** * 分享加密串 */ shareInfo: string; /** * 后续交互使用的token */ token: string; /** * 学习时长,单位s */ totalTime: number; /** * 昵称 */ username?: string; }
import { http } from '@kit.NetworkKit'
import { iLoginDataModel, iResponseModel } from '../../models/AccountModel'
import { promptAction, router } from '@kit.ArkUI'const baseUrl: string = 'https://api-harmony-teach.itheima.net/hm/' // url的基地址
export class HdHttp {
// 静态的 get泛型方法
// get<t>('getclock') 带参数调用:get<t>('clockinInfo?year=2024&month=4')
static async get<T>(url: string) {
try {
// 2.0 发请求
const httpRequest = http.createHttp()url = baseUrl + url
// 获取token
// 获取token,判断如果有token,则传,否则不传
let user = AppStorage.get('user') as iLoginDataModel
let token = user?.token // 可选 【可空]类型let res = await httpRequest.request(url, {
method: http.RequestMethod.GET,
header: {
'Authorization': `Bearer ${token}`
},
expectDataType: http.HttpDataType.OBJECT
})// 响应
// 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录
let resData = res.result as iResponseModel<T>
if(resData.code === 401){
promptAction.showToast({ message: '登录超时,请重新登录' })
router.pushUrl({url:'pages/LoginPage'})
}
return resData
} catch (err) {
promptAction.showToast({ message: 'get网络错误' })
return Promise.reject(err) // 如果报错则将错误返回
}
}
// 静态的post泛型方法
// url: 请求url地址
// extraData:post请求体的参数,因为不是每个url都要求传递,所以定义为可选参数
/* 封装思路:
固定代码写死,可变的地方提炼成参数供外部调用的时候传入
* */
static async post<T>(url: string, extraData?: Object) {
try {// 创建http对象
const httpRequest = http.createHttp()// 完整拼接url地址
url = baseUrl + url// 设置请求参数
let options: http.HttpRequestOptions = {
method: http.RequestMethod.POST,
header: {
"Content-Type": 'application/json'
},
expectDataType: http.HttpDataType.OBJECT // http模块底层将服务器响应回来的json字符串自动调用JSON.parse转成对象
}
// 判断如果extraData有值,则向options对象增加一个extraData的属性
if (extraData) {
options.extraData = extraData
}
// 获取token,判断如果有token,则传,否则不传
let user = AppStorage.get('user') as iLoginDataModel
let token = user?.token // 可选 【可空]类型
if (token && options.header) {
options.header['Authorization'] = `Bearer ${token}`
}
// 调用reqeust方法并且指定相应的参数
let res = await httpRequest.request(url, options)// 响应服务器的数据
// 由于不同的接口返回的数据类型不一样,所以此方法应该用一个泛型来替代,将来实际运行的时候是什么类型就返回什么类型
// 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录
let resData = res.result as iResponseModel<T>
if(resData.code === 401){
promptAction.showToast({ message: '登录超时,请重新登录' })
router.pushUrl({url:'pages/LoginPage'})
}
return resData
} catch (err) {
promptAction.showToast({ message: 'post网络错误' })
return Promise.reject(err) // 如果报错则将错误返回
}
}
}