HttpRequest.ets 3.06 KB
import ArrayList from '@ohos.util.ArrayList';
import service from './AxiosRequest';
import { HttpUtils } from '../utils/HttpUtils';
import { AxiosError, AxiosHeaders, AxiosRequestConfig, RawAxiosRequestHeaders } from '@ohos/axios';
import { ResponseDTO } from '../bean/ResponseDTO';
import HashMap from '@ohos.util.HashMap';

export class HttpRequest {
  private static globalHeaderProviders: ArrayList<() => Record<string, string>> = new ArrayList();

  static addGlobalHeaderProvider(provider: () => Record<string, string>) {
    HttpRequest.globalHeaderProviders.add(provider)
  }

  static initHttpHeader() {
    HttpRequest.addGlobalHeaderProvider(() => {
      return HttpUtils.buildHeaders();
    })
  }

  // 加入泛型限定,返回数据类型为T,
  static request<T = ResponseDTO<string>>(config: AxiosRequestConfig): Promise<T> {
    return new Promise<T>((resolve, reject) => {
      service.request<ResponseDTO<string>, T>(config)
        .then((res: T) => {
          resolve(res)
        })
        .catch((err: AxiosError) => {
          reject(err)
        })
    })
    // return service.request<any, T>(config)
  }

  static buildHeaderWithGlobalHeader(headers?: HashMap<string, string>): AxiosHeaders {
    let commonHeader: AxiosHeaders = new AxiosHeaders()
    headers?.forEach((v, k) => {
      commonHeader.set(k, v);
    });
    HttpRequest.globalHeaderProviders.forEach((func) => {
      let headers = func();
      for (const obj of Object.entries(headers)) {
        commonHeader.set(obj[0], obj[1]);
      }
    })
    if (!commonHeader.get('Content-Type')) {
      commonHeader.set('Content-Type', 'application/json;charset=utf-8');
    }
    return commonHeader
  }

  static get<T = ResponseDTO<string>>(url: string, headers?: HashMap<string, string>): Promise<T> {
    let config: AxiosRequestConfig = {
      headers: HttpRequest.buildHeaderWithGlobalHeader(headers)
    }
    return service.get(url, config)
  }

  static post0<T = ResponseDTO<string>>(url: string, data?: object, headers?: HashMap<string, string>): Promise<T> {
    let config: AxiosRequestConfig = {
      headers: HttpRequest.buildHeaderWithGlobalHeader(headers)
    }
    return service.post(url, data, config)
  }

  static post<T = any>(url: string, data1?: any, headers?: HashMap<string, string>): Promise<T> {
    let requestHeaders: AxiosHeaders = new AxiosHeaders()
    headers?.forEach((v, k) => {
      requestHeaders.set(k, v);
    });
    let config: AxiosRequestConfig = {
      headers: requestHeaders as RawAxiosRequestHeaders,
    }
    return service.post(url, data1, config)
  }

  static put<T = ResponseDTO<string>>(url: string, data?: object, headers?: HashMap<string, string>): Promise<T> {
    let config: AxiosRequestConfig = {
      headers: HttpRequest.buildHeaderWithGlobalHeader(headers)
    }
    return service.put(url, data, config)
  }

  static delete<T = ResponseDTO<string>>(url: string, headers?: HashMap<string, string>): Promise<T> {
    let config: AxiosRequestConfig = {
      headers: HttpRequest.buildHeaderWithGlobalHeader(headers)
    }
    return service.delete(url, config)
  }
}