【端云一体化】云函数的使用

news2025/1/15 0:04:08

前言

为丰富HarmonyOS对云端开发的支持、实现端云联动,DevEco Studio以Cloud Foundation Kit(云开发服务)为底座、在传统的“端开发”基础上新增“云开发”能力,开发者在创建工程时选择合适的云开发工程模板,即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开发,体验端云一体化协同开发。

接下来,本小节将深入细致地介绍云函数的整个开发流程,从环境搭建到代码编写,再到测试与部署,每一步都将为您揭开端云一体化开发的神秘面纱。

参考文档:端云一体化开发

前期准备

Step1:创建AGC项目

Step2:创建HarmonyOS应用/元服务

Step3:

 使用云函数前请先开通云函数服务

此时就已经开通完成

创建应用工程

如果是应用可参照文档 创建HarmonyOS应用工程

如果是元服务可参照文档 创建元服务工程

注意:

Bundle name 需要与 AGC 中所创建的包名保持一致!!!

AGC中的应用包名可以在项目设置中查看,如下图:

应用工程创建完成后,会有两个目录:ApplicationCloudProgram

端侧开发在Application目录下进行,云侧开发在CloudProgram目录下进行。

云侧开发云函数

新建云函数

可参照文档:创建并配置函数

cloudfunctions 目录下右键新建  Cloud Function

“cloudfunctions”目录下生成新建的“hello”函数目录,目录下主要包含如下文件:

  • 函数配置文件“function-config.json”
  • 函数入口文件“hello.ts”
  • 依赖配置文件“package.json”

hello.ts 里内容如下:

let myHandler = async function (event, context, callback, logger) {
  logger.info(event);

  // do something here

  callback({
    code: 0,
    desc: "Success."
  });
};

export { myHandler };

四大参数:

  • event:包含了触发函数执行的事件的数据。
  • context:关于函数执行环境的信息。
  • callback:用于在异步操作中完成后返回结果。
  • logger:用于记录日志的对象。

云函数触发时机

  • http请求

可在配置文件“function-config.json”的“triggers”下配置触发器,

编写云函数

let myHandler = async function (event, context, callback, logger) {
  logger.info(JSON.stringify(event));

  // do something here

  callback({
    code: 200,
    msg: "Hello"
  });
};

export { myHandler };

 调试云函数

 可参照文档:调试函数

 由此可见,本地调试云函数成功

部署云函数

cloudfunctions 目录下右键Deplpy Cloud Functions

操作完成后,可以前往AGC控制台查看云函数

点击测试,测试一下云函数

测试结果同本地测试。测试日志,可以点击运行日志进行查看。

端侧调用云函数

添加依赖

Application\entry\oh-package.json5 文件下添加依赖

{
  "license": "",
  "devDependencies": {},
  "author": "",
  "name": "entry",
  "description": "Please describe the basic information.",
  "main": "",
  "version": "1.0.0",
  "dependencies": {
    "@hw-agconnect/cloud": "^1.0.0",
    "@hw-agconnect/hmcore": "^1.0.0",
  }
}

初始化AGC

Application\entry\src\main\ets\entryability\EntryAbility.ets 文件下配置

import { abilityAccessCtrl, AbilityConstant, PermissionRequestResult, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import {initialize} from  "@hw-agconnect/hmcore";
import buffer from '@ohos.buffer';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    let AtManager = abilityAccessCtrl.createAtManager();
    AtManager.requestPermissionsFromUser(this.context, ['ohos.permission.READ_MEDIA', 'ohos.permission.MEDIA_LOCATION'])
      .then((data: PermissionRequestResult) => {
        hilog.info(0x0000, 'testTag', '%{public}s', 'request permissions from user success' + data);
      })
      .catch((err: Object) => {
        hilog.error(0x0000, 'testTag', 'Failed to request permissions from user. Cause: %{public}s',
          JSON.stringify(err) ?? '');
      });
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  async onWindowStageCreate(windowStage: window.WindowStage) {
    const context = this.context
    const  value = await context.resourceManager.getRawFileContent("agconnect-services.json")
    let json:string= buffer.from(value).toString("utf8")
    initialize(this.context,JSON.parse(json))
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    windowStage.loadContent('pages/Splash', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }
  
  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

⚠️注意:

agconnect-services.json 需要从 AGC 中的项目设置进行下载。

然后添加在 \Application\entry\src\main\resources 下新建目录 rawfile 并移动至该目录。

如果云侧项目开通了新的服务,端侧需要重新下载 agconnect-services.json 。

调用云函数

import hilog from '@ohos.hilog';
import cloud from '@hw-agconnect/cloud'

interface HelloResponse {
  code: number,
  msg: string
}

@Entry
@Component
struct Index {
  @State msg: string = ""
  build() {
    Row(){
      Column(){
        Button("调用云函数").onClick(async ()=>{
          const res = await cloud.callFunction({
            name: "hello"
          })
          hilog.info(0,"hello",JSON.stringify(res))
          /*
           * {"ret":{"code":0,"msg":"OK"},"responseBody":{"code":200,"msg":"Hello"}}
           * */
          const val: HelloResponse = res.getValue()
          hilog.info(0,"hello",JSON.stringify(val))
          /*
           * {"code":200,"msg":"Hello"}
           * */
          this.msg = val.msg
        })
        Text(this.msg)
      }.width("100%")
    }.height("100%")
  }
}

⚠️注意:

查看云函数调用结果需要使用模拟器进行操作 

云函数传参

修改端侧代码

import hilog from '@ohos.hilog';
import cloud from '@hw-agconnect/cloud'

interface HelloResponse {
  code: number,
  msg: string
}

@Entry
@Component
struct Index {
  @State msg: string = ""
  @State name: string = ""
  build() {
    Row(){
      Column(){
        TextInput({placeholder: "请输入姓名"})
          .onChange((value: string)=>{
            this.name = value;
          })
        Button("调用云函数").onClick(async ()=>{
          const res = await cloud.callFunction({
            name: "hello",
            params: {
              name: this.name
            }
          })
          hilog.info(0,"hello",JSON.stringify(res))
          /*
           * {"ret":{"code":0,"msg":"OK"},"responseBody":{"code":200,"msg":"Hello"}}
           * */
          const val: HelloResponse = res.getValue()
          hilog.info(0,"hello",JSON.stringify(val))
          /*
           * {"code":200,"msg":"Hello"}
           * */
          this.msg = val.msg
        })
        Text(this.msg)
      }.width("100%")
    }.height("100%")
  }
}

加入了文本框,用于输入要传递的参数。

修改云侧代码

使用 event 获取端侧传递的参数

event 对象参照文档:event对象

let myHandler = async function (event, context, callback, logger) {
  logger.info(JSON.stringify(event));

  const obj = JSON.parse(event.body)
  const name = obj.name

  callback({
    code: 200,
    msg: `Hello ${name}`
  });
};

export { myHandler };

结语

至此,我们已经详尽地介绍了云函数的操作流程,从项目初始化到云函数的具体实现,再到调试与部署。在下一小节中,我们将介绍华为认证服务的是如何使用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行业案例:高德服务单元化方案和架构实践

目录 为什么要做单元化 高德单元化的特点 高德单元化实践 服务单元化架构 就近接入实现方案 路由表设计 路由计算 服务端数据驱动的单元化场景 总结 系列阅读 为什么要做单元化 单机房资源瓶颈 随着业务体量和服务用户群体的增长,单机房或同城双机房无法支持服…

基于单片机的语音控制玩具汽车的设计

语音控制小汽车选用了两个单片机、一个语音识别芯片、两个无线收发模块、一个电机驱动模块、两个电机、一个音频解码模块。语音控制端选用了一个语音识别芯片,实现了将声音信号转换成数字信号,再将数据传输给单片机的功能。小车端选用了单片机来控制电机…

解锁“搭子小程序”开发新机遇,助力企业数字化转型

搭子作为一种新型的社交方式,逐渐进入到了年轻人的生活中,在日常旅游、学习、逛街等,年轻人都可以找到志同道合的“搭子”,提高生活的幸福指数。 随着搭子市场的发展,通过互联网寻找搭子已经成为了年轻人的必备方式。…

Spring Boot 2 学习全攻略

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今快速发展的 Java 后端开发领域,Spring Boot 2 已然成为一股不可忽视的强大力量。它简化了 Spring 应用的初始搭建以及开发过程,让开发者能够更加专注于业务逻辑的实现&am…

31_搭建Redis分片集群

Redis的主从复制模式和哨兵模式可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题。由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Red…

IMX6U Qt 开发环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、交叉编译 1. 安装通用 ARM 交叉编译工具链 2. 安装 Poky 交叉编译工具链 二、编译出厂源码 1. U-boot 2. 内核和模块 3. 编译出厂 Qt GUI 综合 Demo 前言…

数据结构与算法之链表: LeetCode 92. 反转链表 II (Ts版)

反转链表 II https://leetcode.cn/problems/reverse-linked-list-ii/description/ 描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 示例 1 输入&…

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录

一、import导入css样式 在项目文件中创建一个common文件夹&#xff0c;下面创建一个css文件夹&#xff0c;里面放上style.css文件&#xff0c;编写的是公共样式&#xff0c;我们现在要在App.vue中引入该样式。 在App.vue中引入该样式&#xff0c;这样就会使样式全局生效&#…

MySQL中的四种表联结

目录 1、联结、关系表 &#xff08;1&#xff09;关系表 &#xff08;2&#xff09;为什么使用联结 2、如何创建联结 &#xff08;1&#xff09;笛卡尔积&#xff08;叉联结&#xff09;--用逗号分隔 &#xff08;2&#xff09;where子句的重要性 &#xff08;3&#xff…

DVWA靶场CSRF漏洞通关教程及源码审计

目录标题 CSRFlow源码审计 medium源码审计 high源码审计 impossible源码审计 CSRF low 先修改密码 看到地址栏 复制在另一个网页打开 成功登录 源码审计 没有任何过滤措施&#xff0c;很危险&#xff0c;并且采用了不安全的md5加密 <?phpif( isset( $_GET[ Change ] )…

JVM之垃圾回收器G1概述的详细解析

G1(并发) G1 特点 G1&#xff08;Garbage-First&#xff09;是一款面向服务端应用的垃圾收集器&#xff0c;应用于新生代和老年代、采用标记-整理算法、软实时、低延迟、可设定目标&#xff08;最大 STW 停顿时间&#xff09;的垃圾回收器&#xff0c;用于代替 CMS&#xff0…

宝塔面板 申请证书后 仍然提示不安全

证书显示有效&#xff0c;但是网站显示不安全 导致的原因是引入静态文件使用的是HTTP&#xff0c;查看方法为F12打开console控制台 可以看到静态文件全部都是HTTP 网站采用wordpress搭建&#xff0c;基于问题解决&#xff0c;其他方式搭建也是一样&#xff0c;处理掉所有的H…

【1】Word:邀请函

目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开&#xff0c;wps打开作答无效☞作答完毕&#xff0c;F12或者手动另存为&#xff08;考生文件夹&#xff1a;路径文件名&#xff09; 注意&#xff1a;一定要检查&#xff0c;很有可能你前面步…

Docker安装和卸载(centos)

Docker安装和卸载 一&#xff0c;已安装Docker&#xff0c;卸载Docker 1.方法一 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine​ 如果出现以下提示就证明没卸载…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…

ASP.NET Core - 日志记录系统(二)

ASP.NET Core - 日志记录系统&#xff08;二&#xff09; 2.4 日志提供程序2.4.1 内置日志提供程序2.4.2 源码解析 本篇接着上一篇 ASP.NET Core - 日志记录系统(一) 往下讲&#xff0c;所以目录不是从 1 开始的。 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括…

无源器件-电容

电容器件的参数 基本概念由中学大学物理或电路分析内容获得&#xff0c;此处不做过多分析。 电容的产量占全球电子元器件产品的40%以上。 单位&#xff1a;法拉 F&#xff1b;1F10^6uF&#xff1b;电路中常见的104电容就是10*10^4pF100nF0.1uF C为电容&#xff0c;Rp为绝缘电…

云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换

Video-Background-Removal 是一款革命性的视频背景替换工具&#xff0c;旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户&#xff0c;这款软件都能让你在几秒钟内改变背景&#xff0c;完全消除限制&#xff0c;随心所欲&#xff0c;随时随地想换就换&am…

HCIP笔记1--IP路由基础回顾、BFD单臂回声、OSPF基础

1. 路由基础回顾 概念 AS(Aotonomous System): 自治系统&#xff0c;由同一机构管理的路由器集合。LAN(Local Area Network): 局域网&#xff0c;用户所使用的网络WAN(Wideless Area Network): 广域网&#xff0c;运营商网络广播域&#xff1a;一个广播帧能在网络中到达的所有…

【Linux网络编程】数据链路层 | MAC帧 | ARP协议

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 &#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系…