HttpBizUtil.ets
5.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import { SpConstants } from 'wdConstant/Index';
import { EmitterEventId, EmitterUtils, Logger, SPHelper, ToastUtils } from 'wdKit/Index';
import HashMap from '@ohos.util.HashMap';
import { ResponseDTO } from '../bean/ResponseDTO';
import { HttpUrlUtils, WDHttp } from '../../../../Index';
import { RefreshTokenRes } from '../bean/RefreshTokenRes';
import { ResposeError } from '../bean/ResposeError';
import { HttpUtils } from '../utils/HttpUtils';
const TAG: string = 'HttpBizUtil'
/**
* 网络请求工具,业务封装http,暂添加TokenInterceptor功能
* TODO 待优化,将HttpBizUtil接入 AxiosInstance.interceptors.response.use
*/
export class HttpBizUtil {
/**
* get请求,封装了刷新token逻辑,接口选用,不涉及业务接口可以用原来的接口(如page接口)。
*
* @param url 请求地址
* @param headers 请求header参数
* @returns 返回值
*/
static get<T = ResponseDTO<string>>(url: string, headers?: HashMap<string, string>): Promise<T> {
return new Promise<T>((success, error) => {
WDHttp.get<T>(url, headers).then((originalRes: T) => {
success(originalRes)
}).catch((res: ResposeError) => {
// 403:临时token;406:强制下线、封禁、清空登录信息还要跳转登录页面
if (res.code == 403 || res.code == 406) {
HttpBizUtil.refreshToken().then((token: string) => {
if (!headers) {
headers = new HashMap()
}
headers?.replace('RMRB-X-TOKEN', token)
headers?.replace('cookie', 'RMRB-X-TOKEN=' + token)
Logger.debug(TAG, 'get again send: ' + token)
// refreshToken为空场景不处理,直接请求接口。
WDHttp.get<T>(url, headers).then((againResDTO: T) => {
Logger.debug(TAG, 'get again: ' + againResDTO)
success(againResDTO)
}).catch((res: object) => {
error(ResposeError.buildError(JSON.stringify(res)))
})
});
} else {
// 非403、406,直接抛出去
Logger.debug(TAG, 'get else: ' + JSON.stringify(res))
error(res)
}
})
})
}
/**
* post请求,封装了刷新token逻辑,接口选用,不涉及业务接口可以用原来的接口(如page接口)。
*
* @param url 请求地址
* @param headers 请求header参数
* @returns 返回值
*/
static post<T = ResponseDTO<string>>(url: string, data?: object, headers?: HashMap<string, string>): Promise<T> {
return new Promise<T>((success, error) => {
WDHttp.post<T>(url, data, headers).then((originalRes: T) => {
success(originalRes)
}).catch((res: ResposeError) => {
// 403:临时token;406:强制下线、封禁、清空登录信息还要跳转登录页面
Logger.debug(TAG, 'post catch error: ' + JSON.stringify(res))
if (res.code == 403 || res.code == 406) {
HttpBizUtil.refreshToken().then((token: string) => {
if (!headers) {
headers = new HashMap()
}
headers?.replace('RMRB-X-TOKEN', token)
headers?.replace('cookie', 'RMRB-X-TOKEN=' + token)
Logger.debug(TAG, 'post again send: ' + token)
// refreshToken为空场景不处理,直接请求接口。
WDHttp.post<T>(url, data, headers).then((againResDTO: T) => {
Logger.debug(TAG, 'post again success: ' + JSON.stringify(againResDTO))
success(againResDTO)
}).catch((res: object) => {
error(ResposeError.buildError(JSON.stringify(res)))
})
});
} else {
// 非403、406,直接抛出去
error(res)
}
})
})
}
/*
* 获取刷新后的token,可能为空
*/
static refreshToken(): Promise<string> {
let url = HttpUrlUtils.getRefreshTokenUrl();
let params: RefreshTokenParam =
new RefreshTokenParam(HttpUtils.getRefreshToken(), HttpUtils.getDeviceId())
// 请求刷新token接口
return new Promise<string>((success, error) => {
WDHttp.post<ResponseDTO<RefreshTokenRes>>(url, params).then((resDTO: ResponseDTO<RefreshTokenRes>) => {
let newToken = ''
if (resDTO) {
Logger.debug(TAG, 'refreshToken getRefreshToken: ' + resDTO.message)
Logger.debug(TAG, 'refreshToken getRefreshToken: ' + resDTO.code)
if (resDTO.code == 377) {
// 377强制用户下线、重新登录、封禁等场景;refreshToken 失效
ToastUtils.showToast("已登出,请重新登入", 1000);
EmitterUtils.sendEmptyEvent(EmitterEventId.FORCE_USER_LOGIN_OUT)
// WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
} else if (resDTO.code == 0 && resDTO.data) {
newToken = resDTO.data.jwtToken
let refreshToken = resDTO.data.refreshToken
SPHelper.default.save(SpConstants.USER_JWT_TOKEN, newToken)
SPHelper.default.save(SpConstants.USER_REFRESH_TOKEN, refreshToken)
Logger.debug(TAG, 'refreshToken jwtToken: ' + resDTO.data.jwtToken)
Logger.debug(TAG, 'refreshToken refreshToken: ' + resDTO.data.refreshToken)
}
}
Logger.debug(TAG, 'refreshToken last jwtToken: ' + newToken)
success(newToken)
});
})
}
}
export class RefreshTokenParam {
refreshToken: string = ''
deviceId: string = ''
constructor(refreshToken: string, deviceId: string) {
this.refreshToken = refreshToken
this.deviceId = deviceId
}
}