OpenHarmony实战开发-如何实现防盗链应用功能。

介绍

目前许多网络图片资源有防盗链功能,需要在请求头中设置正确的Referer。本模块使用了第三方库imageknife,通过在请求头中添加Referer来获取防盗链图片功能。同时我们可以设置请求头中的其他参数,比如User-Agent来设置客户端,Origin设置来源,ETag来设置缓存等等。

使用说明:

  1. 输入需要获取的图片URL和Referer。
  2. 点击请求,等待下方出现图片。

效果图预览

实现思路

1.在工程入口导入三方库imageKnife,并且进行初始化。

  1. //
    通过ImageKnifeGlobal.getInstance()获取唯一实例。如果此实例不存在,则将ImageKnife注入到当前context中。
    if (!ImageKnifeGlobal.getInstance().getImageKnife()) { const
    context: Context = getContext(); if (context) {
    ImageKnife.with(context); } }

2.自定义请求头需要重新封装RequestOption对象,使用addHeader方法配置请求头,load方法设置需要请求的地址,errorholder方法设置请求失败回调,addListener方法设置成功回调等配置,最后在成功/失败回调中的图片赋值给图片组件。

c 复制代码
// TODO: 知识点:自定义RequestOption来获取image图片。
const request = new RequestOption();
// TODO: 知识点:使用addHeader添加请求头。
request.addHeader('Referer', ref);
request.skipMemoryCache(true)
  .diskCacheStrategy(new NONE()) // 取消磁盘缓存
  .errorholder($r('app.media.image_failed'), {
    asyncSuccess: (data: ImageKnifeData) => {
      if (data.isPixelMap()) {
        this.imageKnifeOption.loadSrc = data.drawPixelMap?.imagePixelMap;
      }
    }
  })
  .load(url) // TODO: 知识点:添加请求url。
  .addListener({ // TODO: 知识点:添加请求回调监听器。
    callback: (err: BusinessError | string, data: ImageKnifeData) => {
      if (data.isPixelMap()) {
        if (data.drawPixelMap) {
          // TODO: 知识点:在这里获取到请求返回的图片,将图片赋值给imageKnifeOption.loadSrc。
          this.imageKnifeOption.loadSrc = data.drawPixelMap.imagePixelMap;
        } else {
          this.imageKnifeOption.loadSrc = $r('app.media.image_failed');
        }
      }
      return true;
    }
  })

3.在需要请求图片的地方,将步骤2中自定义的RequestOption对象传入imageknife实例的call函数。

c 复制代码
const compSize: Size = {
  width: IMAGE_THEFT_IMAGEKNIFE_COMPONENT_WIDTH,
  height: IMAGE_THEFT_IMAGEKNIFE_COMPONENT_HEIGHT
};
// (必传)这里setImageViewSize函数必传初始组件大小,因为涉及到图片变换效果都需要适配图像源和组件大小。
// TODO: 知识点:如果是自适应组件等不确定初始图片宽高的情况,可以通过getInspectorByKey获取,参考https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkui-kit-0000001769732210#section10880155113412。
request.setImageViewSize(compSize);
// 最后使用ImageKnife的call函数调用request即可
const imageKnife: ImageKnife | undefined = ImageKnifeGlobal.getInstance().getImageKnife();
if (imageKnife !== undefined) {
  // 由于本例需要通过改变请求头刷新图片,并不需要图片缓存,所以设置磁盘Lru缓存数量设置成0张,0字节,正常业务不需要此设置。
  imageKnife.setLruCacheSize(0, 0);
  imageKnife.call(request);
}

如果大家还没有掌握鸿蒙,现在想要在最短的时间里吃透它,我这边特意整理了《鸿蒙语法ArkTS、TypeScript、ArkUI等...视频教程》以及《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

鸿蒙语法ArkTS、TypeScript、ArkUI等...视频教程:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

OpenHarmony APP开发教程步骤:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

《鸿蒙开发学习手册》:

如何快速入门:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.基本概念
2.构建第一个ArkTS应用
3.......

开发基础知识:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.......

基于ArkTS 开发:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.......

鸿蒙生态应用开发白皮书V2.0PDF:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

相关推荐
别说我什么都不会7 小时前
ohos.net.http请求HttpResponse header中set-ccokie值被转成array类型
网络协议·harmonyos
码是生活8 小时前
鸿蒙开发排坑:解决 resourceManager.getRawFileContent() 获取文件内容为空问题
前端·harmonyos
鸿蒙场景化示例代码技术工程师8 小时前
基于Canvas实现选座功能鸿蒙示例代码
华为·harmonyos
小脑斧爱吃鱼鱼9 小时前
鸿蒙项目笔记(1)
笔记·学习·harmonyos
鸿蒙布道师10 小时前
鸿蒙NEXT开发对象工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
zhang10620910 小时前
HarmonyOS 基础组件和基础布局的介绍
harmonyos·基础组件·基础布局
马剑威(威哥爱编程)10 小时前
在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面
华为·harmonyos·arkts
GeniuswongAir11 小时前
Flutter极速接入IM聊天功能并支持鸿蒙
flutter·华为·harmonyos
90后的晨仔15 小时前
鸿蒙ArkUI框架中的状态管理
harmonyos
别说我什么都不会1 天前
OpenHarmony 5.0(API 12)关系型数据库relationalStore 新增本地数据变化监听接口介绍
api·harmonyos