HarmonyOS 如何进行同步代码编程
网络请求使用cookie(有效期30分钟),手机锁屏超30分钟以上。假如打开APP后同时发起五个请求,如何只确保刷新一次cookie,HarmonyOS中如何实现?okhttp请求拦截器代码(假如同时拦截到五次请求过期)。
async intercept(chain: Chain): Promise<Response> {
let request = chain.requestI();
let response = await chain.proceedI(request);
if (!response.isSuccessful()) {
// url重定向login,刷新cookie
let time: number = systemDateTime.getTime(false)
let timeDelay = time - ApiUtils.refreshCookieTime
if (response.responseCode == HttpErrorCode.Forbidden) {
let locationUrl = response.getHeadersEntry('location')
if (locationUrl == ApiUtils.getXwebRequestUrl(Constant.webLogin)) {
LogUtils.warn(API, `cookie timeout !!!, refreshSession, timeDelay : ${timeDelay}}`)
let resp = await ApiUtils.refreshSession() as BaseResp<object>
if (resp.code == HttpErrorCode.Success) {
request.addHeader(ApiUtils.HEADER_COOKIE_KEY, ApiUtils.getCookie())
LogUtils.info(API, '使用新cookie请求 : ' + request.getHeader(ApiUtils.HEADER_COOKIE_KEY))
response = await chain.proceedI(request) // 重新发起请求
}
}
}
}
response = await DecryptInterceptor.parseHttpResponse(chain, response)
return response
}
/**
* 刷新cookie
* @param chain
*/
public static async refreshSession(): Promise<BaseResp<object>> {
return new Promise((resolve: Function) => {
let resp: BaseResp<object> = new BaseResp<object>()
LogUtils.info(API, 'refreshSession start time : ' + systemDateTime.getTime(false))
Api.getXWebService().refreshSession().then(response => {
let faildMsg = ApiUtils.getFailMsg(response) as FaildMsg
if (null != faildMsg) {
LogUtils.warn(API, 'refreshSession faild : ' + faildMsg.getMsg())
resp.code = HttpErrorCode.Fail
} else {
ApiUtils.refreshCookieTime = systemDateTime.getTime(false)
LogUtils.info(API, 'refreshSession success, time : ' + ApiUtils.refreshCookieTime)
}
resolve(resp)
}).catch(
(error: Error) => {
LogUtils.error(API, 'refreshSession error : ' + error.message)
resp.code = HttpErrorCode.Fail
resolve(resp)
}
)
})
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS Worker多线程如何进行同步?可否提供样例代码?
604浏览 • 1回复 待解决
HarmonyOS 如何进行代码检查
142浏览 • 1回复 待解决
#鸿蒙通关秘籍# HarmonyOS NEXT中的ArkTS如何进行异步编程?
207浏览 • 1回复 待解决
应用有少量C++代码,C++代码如何进行适配?
254浏览 • 1回复 待解决
鸿蒙如何进行代码混淆配置和防反编译?
4174浏览 • 2回复 待解决
HarmonyOS 如何进行音频合成
397浏览 • 1回复 待解决
HarmonyOS 如何进行sdk升级
25浏览 • 1回复 待解决
HarmonyOS 如何进行邀请测试
25浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何使用Surface进行同层渲染绘制?
142浏览 • 1回复 待解决
MVVM设计模式中的ViewModel的顶层数据源是如何与低层数据进行同步的?
506浏览 • 1回复 待解决
分布式数据库,最多能支持多少个设备直接进行同步?
1635浏览 • 1回复 待解决
HarmonyOS如何进行模拟定位?
33浏览 • 1回复 待解决
HarmonyOS HAP之间如何进行通信?
481浏览 • 1回复 待解决
HarmonyOS 如何进行DES加解密
602浏览 • 1回复 待解决
如何进行系统崩溃监控?
750浏览 • 1回复 待解决
HarmonyOS 如何进行数据持久化
394浏览 • 1回复 待解决
如何进行页面横竖屏切换
2008浏览 • 1回复 待解决
页面横竖屏如何进行切换
475浏览 • 1回复 待解决
鸿蒙Js如何进行信息存储!
3334浏览 • 1回复 待解决
多个Cookie如何进行批量设置
2095浏览 • 1回复 待解决
HarmonyOS如何进行数据文件存储
452浏览 • 1回复 待解决
HarmonyOS 如何进行全局初始化操作
44浏览 • 1回复 待解决
HarmonyOS如何进行跨module的页面跳转
569浏览 • 1回复 待解决
HarmonyOS 服务卡片中如何进行网络请求
51浏览 • 1回复 待解决
$r中的资源如何进行比较
1864浏览 • 1回复 待解决
可以参考仓颉编程语言的同步机制中的synchronized关键字,搭配ReentrantMutex一起使用来实现该功能,详细使用方法如下:https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/sync-V5#可重入互斥锁-reentrantmutex
关于获取仓颉sdk和如何使用,可以参考以下链接:
https://developer.huawei.com/consumer/cn/activityDetail/cangjie-beta/