在HarmonyOS中,网络请求时经常使用的。为了提高代码的复用性和可维护性同时避免屎山的存在,我们通常会对网络请求进行封装,以便在整个应用程序中统一管理请求和处理响应。今天我将分享一个基于鸿蒙应用开发 的网络请求封装方案(登录为案例),让代码更加优雅和高效。
1.封装思路
我们的封装方案主要包括两个静态方法:post
和 get
。这两个方法分别用于发送 POST 请求和 GET 请求,并在发送请求之前进行一系列的处理,包括添加请求头、处理 token、处理响应等。
2.基本配置
首先,我们需要定义一个基本的请求地址 baseUrl
,它是所有请求的域名前缀。在这个示例中,我们使用了 https://api-harmony-teach.itheima.net/
作为基本地址。
3.POST 请求封装
typescriptstatic async post<T>(url: string, extraData?: Object) {
try {
const req = http.createHttp()
let options: http.HttpRequestOptions = {
method: http.RequestMethod.POST,
header: {
'Content-Type': 'application/json',
},
expectDataType: http.HttpDataType.OBJECT
}
// 处理额外的数据
if (extraData) {
options.extraData = extraData
}
// 处理 token
let user = AppStorage.get('user') as ILoginUsersModel
let token = user?.token
if (token && options.header) {
options.header['Authorization'] = `Bearer ${token}`
}
// 发送请求获取服务器响应
let res = await req.request(baseUrl + url, options)
// 处理响应数据
let resData = res.result as IResponseModel<T>
if (resData.code !== 10000) {
if (resData.code === 401) {
// 处理 token 失效情况
// 提示用户重新登录并跳转到登录页
promptAction.showToast({ message: 'token失效,请重新登录' })
router.replaceUrl({ url: 'pages/LoginPage' })
} else {
// 其他错误情况,显示错误信息
promptAction.showToast({ message: resData.message })
}
}
return resData
} catch (err) {
// 请求错误处理
promptAction.showToast({ message: '请求网络错误' })
return Promise.reject(err)
}
}
4.GET 请求封装
typescriptstatic async get<T>(url: string) {
try {
const req = http.createHttp()
let options: http.HttpRequestOptions = {
header: {
'Content-Type': 'application/json',
},
expectDataType: http.HttpDataType.OBJECT
}
// 处理 token
let user = AppStorage.get('user') as ILoginUsersModel
let token = user?.token
if (token && options.header) {
options.header['Authorization'] = `Bearer ${token}`
}
// 发送请求获取服务器响应
let res = await req.request(baseUrl + url, options)
// 处理响应数据
let resData = res.result as IResponseModel<T>
if (resData.code !== 10000) {
if (resData.code === 401) {
// 处理 token 失效情况
// 提示用户重新登录并跳转到登录页
promptAction.showToast({ message: 'token失效,请重新登录' })
router.replaceUrl({ url: 'pages/LoginPage' })
} else {
// 其他错误情况,显示错误信息
promptAction.showToast({ message: resData.message })
}
}
return resData
} catch (err) {
// 请求错误处理
promptAction.showToast({ message: 'get请求网络错误' })
return Promise.reject(err)
}
}
5.总结
通过以上封装,我们可以在项目中轻松使用 HdHttp.post()
和 HdHttp.get()
方法来发送网络请求,并且可以统一处理请求头、token、以及处理响应的逻辑,使代码更加整洁和可维护。当然,根据实际情况,你还可以进一步完善这个封装方案,以满足项目的特定需求。