首页 > 编程语言 >鸿蒙网络编程系列 43- 仓颉版 HttpRequest 下载文件示例

鸿蒙网络编程系列 43- 仓颉版 HttpRequest 下载文件示例

时间:2024-11-10 22:10:00浏览次数:1  
标签:HttpRequest 示例 43 width fontSize let 100 ckla com

HttpRequest 文件下载示例编写
下面详细介绍创建该示例的步骤(确保 DevEco Studio 已安装仓颉插件)。

步骤 1:创建[Cangjie]Empty Ability 项目。

步骤 2:在 module.json5 配置文件加上对权限的声明:

"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]

这里添加了访问互联网的权限。

步骤 3:在 build-profile.json5 配置文件加上仓颉编译架构:

"cangjieOptions": {
"path": "./src/main/cangjie/cjpm.toml",
"abiFilters": ["arm64-v8a", "x86_64"]
}

步骤 4:在 main_ability.cj 文件里添加如下的引用:

import ohos.ability.*

然后定义变量 globalContext:

var globalContext: Option = Option.None

在 onCreate 函数里添加如下的代码:

globalContext = this.context

步骤 5:在 index.cj 文件里添加如下的代码:

package ohos_app_cangjie_entry

import ohos.base.*
import ohos.component.*
import ohos.state_manage.*
import ohos.state_macro_manage.*
import std.collection.HashMap
import ohos.net.http.*
import ohos.file_picker.*
import ohos.ability.getStageContext
import ohos.ability.*
import ohos.file_fs.*

@Entry
@Component
class EntryView {
@State
var title: String = '仓颉版文件下载示例';
//连接、通讯历史记录
@State
var msgHistory: String = ''
//首页地址
@State
var downloadUrl: String = "http://...:8081/download?filename=demo.txt"
//登录地址
@State
var loginUrl: String = "http://...:8081/auth"
//用户名
@State
var loginName: String = "zhanglei"
//密码
@State
var passwd: String = "HarmonyOS"

@State
//保存到的本地文件名称
var localFileName: String = "demo.txt"
//cookie中传递的sessionid
var sessionId: String = ""
let scroller: Scroller = Scroller()

func build() {
    Row {
        Column {
            Text(title).fontSize(14).fontWeight(FontWeight.Bold).width(100.percent).textAlign(TextAlign.Center).
                padding(10)

            Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {
                Text("用户名:").fontSize(14)

                TextInput(text: loginName).onChange({
                    value => loginName = value
                }).width(100).fontSize(11).flexGrow(1)

                Text("密码:").fontSize(14)

                TextInput(text: passwd).onChange({
                    value => passwd = value
                }).width(100).fontSize(11).setType(InputType.Password).flexGrow(1)
            }.width(100.percent).padding(10)

            Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {
                Text("登录地址:").fontSize(14).width(80)

                TextInput(text: loginUrl).onChange({
                    value => loginUrl = value
                }).width(100).fontSize(11).flexGrow(1)

                Button("登录").onClick {
                    evt => login()
                }.width(70).fontSize(14).flexGrow(0)
            }.width(100.percent).padding(10)

            Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {
                Text("下载文件地址:").fontSize(14)

                TextInput(text: downloadUrl).onChange({
                    value => downloadUrl = value
                }).width(100).fontSize(11).flexGrow(1)
            }.width(100.percent).padding(10)

            Flex(FlexParams(justifyContent: FlexAlign.End, alignItems: ItemAlign.Center)) {
                Text("本地文件名称:").fontSize(14)

                TextInput(text: localFileName).onChange({
                    value => localFileName = value
                }).width(100).fontSize(11).flexGrow(1)

                Button("下载").onClick {
                    evt => downloadFile()
                }.width(70).fontSize(14)
            }.width(100.percent).padding(10)

            Scroll(scroller) {
                Text(msgHistory).textAlign(TextAlign.Start).padding(10).width(100.percent).backgroundColor(0xeeeeee)
            }.align(Alignment.Top).backgroundColor(0xeeeeee).height(300).flexGrow(1).scrollable(
                ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarWidth(20)
        }.width(100.percent).height(100.percent)
    }.height(100.percent)
}

//下载文件
func downloadFile() {
    //http请求对象
    let httpRequest = createHttp();
    let header = HashMap<String, String>(
        ("Accept-Encoding", "gzip, deflate, br"),
        ("Cookie", 'sessionid=' + this.sessionId),
        ("User-Agent",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
    );
    let opt = HttpRequestOptions(
        method: RequestMethod.GET,
        header: header,
        expectDataType: HttpDataType.ARRAY_BUFFER
    )

    httpRequest.request(this.downloadUrl, saveFileResponse, options: opt)
}

//下载文件请求的响应函数
func saveFileResponse(err: ?BusinessException, response: ?HttpResponse) {
    if (let Some(e) <- err) {
        msgHistory += "请求失败:" + e.message + "\r\n"
    }

    if (let Some(resp) <- response) {
        msgHistory += "响应码:${resp.responseCode.getValue()}\r\n"

        let localFilePath = globalContext.getOrThrow().filesDir + "/" + this.localFileName
        if (FileFs.access(localFilePath)) {
            FileFs.unlink(localFilePath)
        }
        match (resp.result) {
            case HttpData.ARRAY_DATA(value) =>
                let file = FileFs.open(localFilePath, mode: CREATE.mode | READ_WRITE.mode)
                FileFs.write(file.fd, value)
                FileFs.close(file)

                //输出文件内容
                let content = FileFs.readText(localFilePath)
                msgHistory += "文件内容:${content}\r\n"
            case _ => msgHistory += "响应的数据不是二进制类型\r\n"
        }
    }
}

//登录
func login() {
    //http请求对象
    let httpRequest = createHttp();
    //请求的登录名和密码参数
    let params = "username=" + loginName + "&password=" + passwd

    let header = HashMap<String, String>(("Content-Type", "application/x-www-form-urlencoded"));
    let opt = HttpRequestOptions(
        method: RequestMethod.POST,
        extraData: HttpData.STRING_DATA(params),
        header: header,
        expectDataType: HttpDataType.STRING
    )

    httpRequest.request(loginUrl, dealWithResponse, options: opt)
}

//登录的响应处理函数
func dealWithResponse(err: ?BusinessException, response: ?HttpResponse) {
    if (let Some(e) <- err) {
        msgHistory += "请求失败:" + e.message + "\r\n"
    }

    if (let Some(resp) <- response) {
        msgHistory += "响应码:${resp.responseCode.getValue()}\r\n"

        var findResult = false
        //从setCookie列表中查找名称为sessionid的cookie对应的值
        for (setCookieItem in resp.setCookie) {
            let cookie = setCookieItem.split(";")
            for (cookieItem in cookie) {
                let kvItem = cookieItem.split("=")
                if (kvItem[0].trimAscii() == "sessionid") {
                    sessionId = kvItem[1]
                    findResult = true
                    break;
                }
            }
            if (findResult) {
                msgHistory += "sessionId = ${sessionId}\r\n"
                break
            }
        }
    } else {
        msgHistory += "响应为空\r\n"
    }
}

}

ckla.5000news.com
ckla.2500trip.com
ckla.htsyfs.com
ckla.hmgjjd.com
ckla.tcccpsb.com
ckla.hfsmttp.com
ckla.nnlianbao.com
ckla.xinchengabc.com
ckla.njns56.com
ckla.gzlcjzs.com
ckla.xinlvchuang.com
ckla.juanbanjicj.com
ckla.tongtaijituan.com
ckla.lydsmp.com
ckla.shinenergygroup.com
ckla.jingranchimian.com
ckla.tj-shengming.com
ckla.njxlkhs.com
ckla.shzljr.com
ckla.guanlinyouxuan.com
ckla.ynyoutu.com
ckla.jiadalong.com
ckla.jumeizi.com
ckla.zhs888.com
ckla.cnaoxin.com
ckla.afu365.com
ckla.tzhyex.com
ckla.xincaiit.com
ckla.senmaohuanbao.com
ckla.bjqunlemuye.com
ckla.lxtxqh.com
ckla.yuchentimes.com
ckla.hebeihongqi.com
ckla.ssyhmma.com
ckla.hyl98.com
ckla.youhezhixuan.com
ckla.jilinsport.com
ckla.wychyq.com
ckla.gdhrgk.com
ckla.jzha101.com
ckla.lutuohb.com
ckla.sgxinfeng.com
ckla.bjyongxuan.com
ckla.jxtrfund.com
ckla.fyjyzsgs.com
ckla.zgygzl.com
ckla.clwzycgp.com
ckla.wencfcw.com
ckla.zmuoo.com
ckla.xphysc.com
ckla.kalilan.com
ckla.jiexinlong.com
ckla.shiyongsh.com
ckla.myjhedu.com
ckla.xczipper.com
ckla.yjlzk.com
ckla.huangpihushuichan.com
ckla.yifanyuanyang.com
ckla.dianyunzhisheng.com
ckla.jx-tq.com
ckla.shenshiapp.com
ckla.hxjweiyu.com
ckla.gjmsxy.com
ckla.zgmcpj.com
ckla.tiquality.com
ckla.toto58.com
ckla.lhcgzj.com
ckla.gdlddb.com
ckla.volanswing.com
ckla.smxbsbl.com
ckla.hflxzsgc.com
ckla.nxttyq.com
ckla.jiamuli.com
ckla.banchendb.com
ckla.aguailuo.com
ckla.gzhajd.com
ckla.gzxuezhe.com
ckla.zywl9780bq.com
ckla.nc-lianshun.com
ckla.sp0557.com

步骤 6:编译运行,可以使用模拟器或者真机。

步骤 7:按照本节第 2 部分“HttpRequest 文件下载演示”操作即可。

  1. 代码分析
    仓颉语言和 ArkTS 毕竟是两种语言,而且在目前阶段,仓颉语言对鸿蒙系统的适配暂时没有 ArkTS 完善,所以,有些 ArkTS 能比较方便使用的方法,在仓颉语言这里可能要适当调整下才能使用,比如获取上下文的函数 getContext,在 ArkTS 里,直接即可即可,而在仓颉语言里,需要先在 main_ability.cj 定义全局变量 globalContext,再从 onCreate 时间处理函数里对其进行赋值,然后再在需要的地方使用。

另外,仓颉版本中,服务端返回的 cookie 信息在当前的 API 中,位于 HttpResponse 类的 setCookie 属性中,并不在 header 属性中,这一点和 ArkTS 也不相同,以后可能会变化。

(本文作者原创,除非明确授权禁止转载)

本文源码地址:

https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/http/FileDownload4Cj

本系列源码地址:

https://gitee.com/zl3624/harmonyos_network_samples

标签:HttpRequest,示例,43,width,fontSize,let,100,ckla,com
From: https://www.cnblogs.com/bkbk123/p/18538628

相关文章

  • C / C++ 整数类型转换规则与示例
    在C语言编程中,不同类型之间的转换是非常常见的事情,尤其是整数类型之间的转换,比如从较短类型到较长类型的转换、从有符号类型到无符号类型的转换等。这些转换看似简单,但如果不理解它们背后的机制,可能会导致一些隐蔽的bug。本文将深入探讨整数类型转换的规则和过程,并通过实例帮助大......
  • 物理约束➕深度学习代码示例
    好的,下面是一个结合物理机制与深度学习的示例代码。这个示例假设我们要预测土壤湿度(类似你的研究领域),并结合物理机制(例如,水的守恒)来改进模型的预测。示例:基于物理约束的土壤湿度预测模型在这个例子中,我们用深度学习模型预测土壤湿度,并在损失函数中加入水分守恒约束项,确保模型输......
  • 使用YOLOv8训练危险化学品车辆检测数据集,数据集包含4300余张图像,yolo格式标注,共分为大
    数据集介绍数据集概述数据集名称:危险化学品车辆检测数据集车辆类别:共4类,分别为大卡车(truck)、油罐车(tanker)、大巴车(bus)、小汽车(car)图像数量:共4300余张JPG图片标签格式:YOLO格式数据集划分:已划分好训练集、验证集和测试集数据集结构假设你的数据集已经按照以下结构组......
  • 华为数据中心CE系列交换机级联M-LAG配置示例
    M-LAG组网简介M-LAG(Multi-chassisLinkAggregation)技术是一种跨设备的链路聚合技术,它通过将两台交换机组成一个逻辑设备,实现链路的负载分担和故障切换,从而提高网络的可靠性和稳定性。下面给大家详细介绍如何在华为交换机上进行M-LAG配置。在配置M-LAG之前,我们需要确认交换机......
  • 历年CSP-J初赛真题解析 | 2019年CSP-J初赛完善程序(34-43)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客矩阵变幻有一个奇幻的矩阵,在不停的变幻,其变幻方式为:数字0变成矩阵[......
  • OpenGL 和 GLSL 在顶点着色器中动态调整裁剪平面参数的简单代码示例
    以下是一个使用OpenGL和GLSL在顶点着色器中动态调整裁剪平面参数的简单代码示例://OpenGL初始化代码#include<GL/glew.h>#include<GLFW/glfw3.h>#include<iostream>GLFWwindow*window;//初始化GLFWvoidinitGLFW(){if(!glfwInit()){std::cer......
  • win10玩游戏找不到d3dx9_43.dll丢失怎么解决,d3dx9_43.dll丢失五种解决方法
    d3dx9_43.dll是MicrosoftDirectX9的一个关键组件,具体而言,它是一个动态链接库(DLL)文件。DirectX是由Microsoft开发的多媒体编程接口,旨在优化Windows操作系统上游戏和多媒体应用程序的性能,特别是图形和声音功能。d3dx9_43.dll文件包含了Direct3D9的一些关键功能,如3......
  • 基于KD树、包围盒与RayCast(射线投射)实现物体拾取的示例代码框架
    以下是一个基于KD树、包围盒与RayCast(射线投射)实现物体拾取的示例代码框架及相关解释。这个示例假设是在一个三维空间场景下进行操作,主要目的是通过从指定视点发出射线,利用KD树对场景中的物体包围盒进行组织和快速搜索,来判断射线与哪个物体相交,从而实现物体的拾取。#include<ios......
  • [LeetCode] 1343. Number of Sub-arrays of Size K and Average Greater than or Equa
    Givenanarrayofintegersarrandtwointegerskandthreshold,returnthenumberofsub-arraysofsizekandaveragegreaterthanorequaltothreshold.Example1:Input:arr=[2,2,2,2,5,5,5,8],k=3,threshold=4Output:3Explanation:Sub-arrays[2......
  • CN9130-2000-NG-AUS-G,88E6341-A0-NXU2C000,88E1548PA0-BAM2I00,88E1543-A1-LKJ2C000,Marv
    可广泛应用于消费类电子产品中。这些系统控制器具有高度集成的功能,包括处理器、存储器、图形处理器和解码器,可以支持多种应用,如智能电视、游戏机、数字音频播放器等。此外,美满电子的系统控制器还具有低功耗和高性能的特点,能够满足现代消费电子产品对处理能力和电池寿命的要求。......