HarmonyOS 鸿蒙Next中如何设置自定义请求头
HarmonyOS 鸿蒙Next中如何设置自定义请求头
Image如何设置自定义请求头?
在HarmonyOS的ArkTS开发中,默认的Image组件不支持直接设置请求头,但可以通过使用扩展库ImageKnife实现自定义请求头的设置。
ImageKnifeComponent({
loadSrc:"http//xx.xx",
customGetImage:custom
})
// 自定义下载方法
@Concurrent
async function custom(context: Context, src: string | PixelMap | Resource,headers?: Record<string,Object>): Promise<ArrayBuffer | undefined> {
return new Promise((resolve,reject)=>{
if (typeof src == "string") {
let session = GetSession.session
let req = new rcp.Request(src,"GET");
session.fetch(req).then((response)=>{
if(response.statusCode == 200) {
let buffer = response.body
resolve(buffer)
} else {
reject("rcp code:"+response.statusCode)
}
}).catch((err:BusinessError)=>{
reject("error rcp src:"+src+",err:"+JSON.stringify(err))
})
}
})
}
参考地址
更多关于HarmonyOS 鸿蒙Next中如何设置自定义请求头的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙原生开发的Image组件暂不支持直接设置自定义请求头
目前三方库ImageKnife支持自定义请求头
ImageKnife
- 专门为OpenHarmony打造的一款图像加载缓存库,致力于更高效、更轻便、更简单。
- 当前更推荐imageknifepro:既提供ArkTs组件方式给ArkTs原生应用使用,也提供Native组件的方式使用;图片加载更快;支持通过拦截器的方式,自定义网络下载,解码,文件缓存,内存缓存。通过责任链-拦截器模式,图片加载任务可以同时应用多个自定义加载方式。
- 项目参考开源库 Glide 进行OpenHarmony的自研版本
Image组件可以方便的加载网络资源:
引入网络图片需申请权限ohos.permission.INTERNET,具体申请方式请参考声明权限。此时,Image组件的src参数为网络图片的链接。
当前Image组件仅支持加载简单网络图片。
更高级的用法推荐使用第三方库:
ImageKnife
专门为OpenHarmony打造的一款图像加载缓存库,致力于更高效、更轻便、更简单。
当前更推荐imageknifepro:既提供ArkTs组件方式给ArkTs原生应用使用,也提供Native组件的方式使用;图片加载更快;支持通过拦截器的方式,自定义网络下载,解码,文件缓存,内存缓存。通过责任链-拦截器模式,图片加载任务可以同时应用多个自定义加载方式。
简介
本项目参考开源库 Glide 进行OpenHarmony的自研版本:
- 支持自定义内存缓存策略,支持设置内存缓存的大小(默认LRU策略)
- 支持磁盘二级缓存,对于下载图片会保存一份至磁盘当中
- 支持自定义实现图片获取/网络下载
- 支持监听网络下载回调进度
- 继承Image的能力,支持option传入border,设置边框,圆角
- 继承Image的能力,支持option传入objectFit设置图片缩放,包括objectFit为auto时根据图片自适应高度
- 支持通过设置transform缩放图片
- 并发请求数量,支持请求排队队列的优先级
- 支持生命周期已销毁的图片,不再发起请求
- 自定义缓存key
- 自定义http网络请求头
- 支持writeCacheStrategy控制缓存的存入策略(只存入内存或文件缓存)
- 支持preLoadCache预加载图片
- 支持onlyRetrieveFromCache仅用缓存加载
- 支持使用一个或多个图片变换,如模糊,高亮等
待实现特性:
- 内存降采样优化,节约内存的占用
- 支持自定义图片解码
注意:3.x版本相对2.x版本做了重大的重构,主要体现在:
- 使用Image组件代替Canvas组件渲染
- 重构Dispatch分发逻辑,支持控制并发请求数,支持请求排队队列的优先级
- 支持通过initMemoryCache自定义策略内存缓存策略和大小
- 支持option自定义实现图片获取/网络下载
因此API及能力上,目前有部分差异,主要体现在:
- 不支持drawLifeCycle接口,通过canvas自会图片
- mainScaleType,border等参数,新版本与系统Image保持一致
- gif/webp动图播放与控制(ImageAnimator实现)
- 抗锯齿相关参数
方案一:原生Image不支持直接设置自定义请求头,Android和iOS也不支持,均使用三方库实现的,可使用ImageKnife三方库https://gitee.com/openharmony-tpc/ImageKnife/tree/master
方案二:通过HTTP请求获取图片数据后转为PixelMap加载
1. 发起带自定义请求头的HTTP请求 使用@ohos.net.http模块发送请求,在header字段中动态设置请求头:
import http from '@ohos.net.http';
import image from '@ohos.multimedia.image';
// 创建HTTP请求
let httpRequest = http.createHttp();
let headers: Record<string, string> = {
'Custom-Header1': 'value1', // 自定义请求头1
'Custom-Header2': 'value2' // 自定义请求头2
};
// 发起GET请求(示例URL)
httpRequest.request(
"https://example.com/image.png",
{
method: http.RequestMethod.GET,
header: headers, // 注入自定义请求头
expectDataType: http.HttpDataType.ARRAY_BUFFER // 接收二进制数据
},
(err, data) => {
if (err) {
console.error("Request failed: " + JSON.stringify(err));
return;
}
// 成功获取二进制数据
if (data && data.result) {
let arrayBuffer = data.result as ArrayBuffer;
loadImage(arrayBuffer); // 转换为图片
}
}
);
2. 将二进制数据转为PixelMap
async function loadImage(arrayBuffer: ArrayBuffer) {
// 创建ImageSource实例
let imageSource = image.createImageSource(arrayBuffer);
// 解码为PixelMap
let pixelMap = await imageSource.createPixelMap();
// 使用PixelMap设置Image组件
// 此处需在UI上下文中更新状态(如@State变量)
}
3. 在Image组件中显示
// UI组件示例
@Entry
@Component
struct ImageExample {
@State pixelMap: image.PixelMap | null = null;
build() {
Column() {
if (this.pixelMap) {
Image(this.pixelMap) // 加载PixelMap
.width(200)
.height(200)
} else {
Text('Loading...')
}
}
.onPageShow(() => {
// 触发HTTP请求
this.loadImageWithHeader();
})
}
// 封装请求逻辑
private loadImageWithHeader() {
// 此处嵌入步骤1的HTTP请求代码
// 在回调函数中更新this.pixelMap
}
}
你可以用这个HttpConnection类
在HarmonyOS Next中,通过Http模块的Request对象设置自定义请求头。使用setHeader()方法添加键值对,例如:request.setHeader("User-Agent", "CustomAgent")。若需多个请求头,重复调用该方法即可。此操作适用于@ohos.net.http API,无需依赖Java或C语言。


