请教一个HarmonyOS封装http请求参数问题?

http请求,传入header报错:

Object literal must correspond to some explicitly declared class or interface (arkts-no-untyped-obj-literals) <ArkTSCheck

代码如下:
1、RequestOptions.ets

/** 
 *  网络请求配置 
 */ 
export interface RequestOptions { 
  //请求地址 
  url?: string; 
  //请求类型,post、get等 
  method?: RequestMethod; 
  //请求参数 
  queryParams ?: Record<string, string>; 
  //自定义请求头 
  header?: Object; 
  //是否显示loading 
  showLoading? : boolean 
  //加载完成是否关闭loading 
  closeLoading? : boolean 
} 
 
export enum RequestMethod { 
  OPTIONS = "OPTIONS", 
  GET = "GET", 
  HEAD = "HEAD", 
  POST = "POST", 
  PUT = "PUT", 
  DELETE = "DELETE", 
  TRACE = "TRACE", 
  CONNECT = "CONNECT" 
}

2、HttpCore.ets

import http from '@ohos.net.http'; 
import { RequestOptions } from './RequestOption'; 
import { BusinessError } from '@kit.BasicServicesKit'; 
import { CommonUtil } from '../utils/CommonUtil'; 
import { url } from '@kit.ArkTS'; 
import { CommonConstants } from '../constans/CommonConstants'; 
 
/** 
 * Http请求器 
 */ 
export class HttpCore { 
  /** 
   * 发送请求 
   */ 
  request<T>(requestOption: RequestOptions): Promise<T> { 
    return new Promise<T>((resolve, reject) => { 
      this.sendRequest(requestOption) 
        .then((response) => { 
          if (typeof response.result !== 'string') { 
            reject(new Error('Invalid data type')); 
 
          } else { 
            let bean: T = JSON.parse(response.result); 
            if (bean) { 
              resolve(bean); 
            } else { 
              reject(new Error('Invalid data type,JSON to T failed')); 
            } 
 
          } 
        }) 
        .catch((error: BusinessError) => { 
          reject(JSON.stringify(error)); 
        }); 
    }); 
  } 
 
 
  private sendRequest(requestOption: RequestOptions): Promise<http.HttpResponse> { 
 
    // 每一个httpRequest对应一个HTTP请求任务,不可复用 
    let httpRequest = http.createHttp(); 
    let resolveFunction: Function 
    let rejectFunction: Function 
    const resultPromise = new Promise<http.HttpResponse>((resolve, reject) => { 
      resolveFunction = resolve; 
      rejectFunction = reject; 
    }); 
 
    if (CommonUtil.isStringEmpty(requestOption.url)) { 
      return Promise.reject(new Error('url不能为空')); 
    } 
 
    let promise = httpRequest.request(CommonConstants.BASE_URL + requestOption.url, { 
      method: requestOption.method, 
      header: requestOption.header, 
      extraData: new url.URLParams(requestOption.queryParams).toString(), // 当使用POST请求时此字段用于传递内容 
      expectDataType: http.HttpDataType.STRING // 可选,指定返回数据的类型 
    }); 
 
    promise.then((response) => { 
      console.info('Result:' + response.result); 
      console.info('code:' + response.responseCode); 
      console.info('header:' + JSON.stringify(response.header)); 
      if (http.ResponseCode.OK !== response.responseCode) { 
        throw new Error('http responseCode !=200'); 
      } 
      resolveFunction(response); 
 
    }).catch((err: BusinessError) => { 
      rejectFunction(err); 
    }).finally(() => { 
      // 当该请求使用完毕时,调用destroy方法主动销毁。 
      httpRequest.destroy(); 
    }) 
    return resultPromise; 
  } 
   
} 
 
export const httpCore = new HttpCore();

3、HttpManager.ets

import { httpCore as HttpCore } from './HttpCore'; 
import { RequestOptions } from './RequestOption'; 
 
/** 
 *  对外管理器 
 */ 
export class HttpManager { 
  private static mInstance: HttpManager = new HttpManager(); 
 
  // 防止实例化 
  private constructor() { 
  } 
 
  static getInstance(): HttpManager { 
    return HttpManager.mInstance; 
  } 
 
  request<T>(option: RequestOptions): Promise<T> { 
    return HttpCore.request(option); 
  } 
}

4.调用

HttpManager.getInstance().request<TestBean>({header:{"Content-Type","application/x-www-form-urlencoded; charset=UTF-8"}}) 
  .then((result) => { 
    console.info(JSON.stringify(result)); 
  }) 
  .catch((err: BusinessError) => { 
    console.error(JSON.stringify(err)); 
  });
阅读 671
1 个回答

在 HarmonyOS Next 中,传入的 header 应该是一个对象,键值对的形式,例如 header: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" }。你的代码中传入的格式不太正确,应该把键和值用冒号连接,并且用逗号分隔不同的键值对

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进