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