写点什么

鸿蒙仓颉语言开发教程:网络请求和数据解析

作者:幽蓝计划
  • 2025-05-30
    山东
  • 本文字数:1645 字

    阅读完需:约 5 分钟

鸿蒙仓颉语言开发教程:网络请求和数据解析

现在我能理解华为方面不断的鼓励大家在网络上贡献自己的教程。没有教程,没有参考文献,仓颉购物应用的开发过程真是举步维艰,每一步都是摸着石头过河,不过希望通过幽蓝君的文章能让大家少走一些弯路。今天就以购物应用的分类列表为例,分享在仓颉开发语言中如何进行网络请求,以及怎么把请求到的数据展示到应用上。



网络权限


网络权限在 app 开发中是一个默认规则,几乎在任何系统的 app 中进行网络请求之前都要获取网络权限,仓颉也不例外。在仓颉语言中网络权限的请求依然是在 module.json5 文件中,在 module 目录下增加网络请求权限:


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


网络请求


添加权限之后,你可以回到应用中进行请求,首先导入 http 模块:


import ohos.net.http.*


然后创建请求实例:


let httpRequest = createHttp()


通常我们还需要一些配置信息,比如请求方法什么的,在仓颉中这个参数类型是 HttpRequestOptions,它里面有很多参数,我只介绍常见的几个:

method:请求方法

extraData:post 方法时传递的内容

expectDataType:指定返回数据的类型

header:


请求头下面为大家展示一个完整的数据请求:


let url = "***/api/class.php"let httpRequest = createHttp() let option = HttpRequestOptions(    method: RequestMethod.GET,    expectDataType: HttpDataType.STRING,    header: HashMap<String, String>([("content-type", "application/json")]))httpRequest.request(url, {err, resp =>    if (let Some(e) <- err) {         CJTools.log('error:' + e.message)    }    if (let Some(r) <- resp) {          CJTools.log(r.result.toString())     }
//请求完成务必销毁实例 httpRequest.destroy() },options:option)
复制代码


 //请求完成务必销毁实例 httpRequest.destroy()},options:option)数据解析
复制代码


看上面这段代码,从创建实例,配置参数到发起请求好像都能看懂,但是到了请求回调中幽蓝君是有一些懵圈的,像 let Some(e) <- err 这种代码我是看不懂一点,估计大家也有多人跟我一样。现在为大家介绍一下 Some 是什么意思,它的意思是构造一个携带参数 Option<T>的实例,表示有值。也就是说上弥漫两个 if 语句是在判断,第一个是判断如果 err 有值表示请求出错了。如果 resp 有值表示请求到了数据。也就是说如果请求成功,Some(r)中的 r 就是我们请求到的数据。现在的 r 应该是字符串类型,那如何把它转换成数组并且能够被组件遍历。我先创建了一个和数据内容字段相同的结构体:


public class ClassItem{private var id: String;private var classname: String;private var cover: String;
public ClassItem(id:String, classname:String,cover:String){ this.id = id this.classname = classname this.cover = cover} public func getId():String{ return this.id}public func getClassname():String{ return this.classname}public func getCover():String{ return this.cover}}
复制代码


然后为大家演示怎么把 r 转换成 ClassItem 组成的数组:


if (let Some(r) <- resp) {        let str = r.result.toString()        let jValue = JsonValue.fromStr(str)        let jArray = jValue.asArray()        for (i in 0..jArray.size()) {            var model = DataModel.fromJson(jArray.get(i).getOrThrow().asObject())            var modelData = match (model) {            case data: DataModelStruct => data                case _ => throw Exception("this data is not DataModelStruct")             }            let item = ClassItem(String.deserialize(modelData.get('id')), String.deserialize(modelData.get('classname')), String.deserialize(modelData.get('cover')))            this.classList.append(item)        }    }
复制代码


最后 classList 就是我们需要的数据,以上就是仓颉语言网络请求的相关内容。#HarmonyOS 语言 ##仓颉 ##购物 #

用户头像

幽蓝计划

关注

还未添加个人签名 2025-05-09 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙仓颉语言开发教程:网络请求和数据解析_幽蓝计划_InfoQ写作社区