HttpBizUtil.ets 5.34 KB
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';

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.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.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: HashMap<string, string> = new HashMap<string, string>()
    params.set('refreshToken', HttpUrlUtils.getRefreshToken())
    params.set('deviceId', HttpUrlUtils.getDeviceId())
    // Logger.debug(TAG, 'refreshToken getRefreshToken: ' + HttpUrlUtils.getRefreshToken())
    // 请求刷新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)
      });
    })
  }
}