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

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 = string>(url: string, headers?: HashMap<string, string>): Promise<ResponseDTO<T>> {
    return new Promise<ResponseDTO<T>>((success, debug) => {
      WDHttp.get<ResponseDTO<T>>(url, headers).then((resDTO: ResponseDTO<T>) => {
        Logger.debug(TAG, 'get: ' + resDTO.code)
        Logger.debug(TAG, 'get: ' + resDTO.message)
        // 403:临时token;406:强制下线、封禁、清空登录信息还要跳转登录页面
        if (resDTO.code == 403 || resDTO.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<ResponseDTO<T>>(url, headers).then((resDTO: ResponseDTO<T>) => {
              Logger.debug(TAG, 'get again: ' + resDTO.message)
              success(resDTO)
            }).catch((res: object) => {
              debug(res)
            })
          });
        } else {
          success(resDTO)
        }
      }).catch((res: object) => {
        debug(res)
      })
    })
  }

  /**
   * post请求,封装了刷新token逻辑,接口选用,不涉及业务接口可以用原来的接口(如page接口)。
   *
   * @param url 请求地址
   * @param headers 请求header参数
   * @returns 返回值
   */
  static post<T = string>(url: string, data?: object, headers?: HashMap<string, string>): Promise<ResponseDTO<T>> {
    return new Promise<ResponseDTO<T>>((success, debug) => {
      WDHttp.post<ResponseDTO<T>>(url, data, headers).then((resDTO: ResponseDTO<T>) => {
        Logger.debug(TAG, 'post: ' + resDTO.code)
        Logger.debug(TAG, 'post: ' + resDTO.message)
        // 403:临时token;406:强制下线、封禁、清空登录信息还要跳转登录页面
        if (resDTO.code == 0 || resDTO.code == 406) {
          HttpBizUtil.refreshToken().then((token: string) => {
            if (headers) {
              headers.replace('RMRB-X-TOKEN', token)
              headers.replace('cookie', 'RMRB-X-TOKEN=' + token)
            }
            // refreshToken为空场景不处理,直接请求接口。
            WDHttp.post<ResponseDTO<T>>(url, headers).then((resDTO: ResponseDTO<T>) => {
              success(resDTO)
            }).catch((res: object) => {
              debug(res)
            })
          });
        } else {
          success(resDTO)
        }
      }).catch((res: object) => {
        debug(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())
    let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
    Logger.debug(TAG, 'refreshToken getRefreshToken: ' + HttpUrlUtils.getRefreshToken())
    // // 请求刷新token接口
    return new Promise<string>((success, debug) => {
      WDHttp.post<ResponseDTO<RefreshTokenRes>>(url, params, headers).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)
          }
        }
        success(newToken)
      });
    })
  }
}