HarmonyOS 鸿蒙Next中如何设置自定义请求头

HarmonyOS 鸿蒙Next中如何设置自定义请求头

Image如何设置自定义请求头?

7 回复

在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))
      })
    }
  })
}

参考地址

https://gitee.com/openharmony-tpc/ImageKnife

更多关于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实现)
  • 抗锯齿相关参数

文档链接:https://gitcode.com/openharmony-tpc/ImageKnife

方案一:原生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语言。

在HarmonyOS Next中,可以通过HttpRequest类的setHeader()方法设置自定义请求头。示例代码:

import http from '@ohos.net.http';

let httpRequest = http.createHttp();
httpRequest.setHeader('Custom-Header', 'YourValue');
// 后续执行请求

注意:自定义请求头需符合HTTP协议规范,避免使用保留字段。

回到顶部