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

前言

为丰富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 };

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YARN 架构组件及原理

一、YARN 体系架构 YARN(Yet Another Resource Negotiator,另一种资源协调者) 是 Hadoop 2.0 中的资源管理系统,它的基本设计思想是将 MRv1 中的 JobTracker拆分成了两个独立的服务 :一个全局的资源管理器 ResourceMa…

C# GDI+的DrawString无法绘制Tab键的现象

【啰嗦2句】 现在用C#的人很少了吧?GDI更少了吧?所以这个问题估计也冷门。没关系,分享给特定需要的人也不错。 【问题现象】 工作中开发了一个报告编辑器,实现图文排版等功能,用着没什么问题,直到有一天…

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上,实例是别的同事搭建的。最近又又又想了解一下,而且已经盘了一些了,所以写写记录一下。因为这个事儿没太多的进度压力,索性写到哪儿算哪儿,只要是新了解到的…

春秋云镜——initial

初步认识内网渗透流程 thinkphp外网打点 打开环境后尝试登陆无果,用fscan扫一下看看 fscan.exe -h 39.99.224.87 发现是think PHP漏洞 补充: fscan:一款内网综合扫描工具,方便一键自动化、全方位漏扫扫描。支持主机存活探测、端…

【C++】string的关系运算与比较分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯基础知识:C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 💯代码解析与扩展代码例一:相等比较代码解析输出 代码例二&a…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …

NVIDIA Clara平台助力医学影像处理:编程案例与实践探索(上)

一、引言 1.1 研究背景与意义 在现代医学领域,医学影像技术已然成为疾病诊断、治疗方案制定以及疗效评估的关键支柱。从早期的 X 射线成像,到如今的计算机断层扫描(CT)、磁共振成像(MRI)、正电子发射断层扫描(PET)等先进技术,医学影像为医生提供了直观、精准的人体内…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点&#xff1a;以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验&#xff0c;避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构&#xff1a;内部上下两排引脚的设计虽然可能不…

【数据结构】第1天之Java中的数据结构

前言 众所周知&#xff0c;程序数据结构算法&#xff0c;可见数据结构的重要性。 在Java中&#xff0c;数据结构通常指的是Java集合框架中的类和接口。 Java集合框架提供了一套标准的数据结构&#xff0c;例如列表、集合、映射表等&#xff0c;以及相应的实现类。 今天要分享的…

Open FPV VTX开源之默认MAVLink设置

Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题9.4 偶尔启动卡住 …

Spring Boot 和微服务:快速入门指南

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

Redis 为什么要引入 Pipeline机制?

在 Redis 中有一种 Pipeline&#xff08;管道&#xff09;机制&#xff0c;其目的是提高数据传输效率和吞吐量。那么&#xff0c;Pipeline是如何工作的&#xff1f;它又是如何提高性能的&#xff1f;Pipeline有什么优缺点&#xff1f;我们该如何使用 Pipeline&#xff1f; 1、…

Cesium小知识:粒子系统的参数详解

Cesium 的粒子系统通过 ParticleSystem 类提供了一套丰富的参数来控制粒子的生成、行为和外观。以下是这些参数的详细说明,帮助你更好地理解和使用 Cesium 的粒子系统。 基本参数 image (String) - 粒子图像的URL路径。这个图像是每个粒子在渲染时使用的纹理。 startColor (Co…

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)

前篇博客有对常用LSA的总结 2类LSA&#xff08;Network-LSA&#xff09; DR产生泛洪范围为本区域 作用:  描述MA网络拓扑信息和网络信息&#xff0c;拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…

【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

【2024年华为OD机试】 (C卷,100分)- 密钥格式化(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个非空字符串 S&#xff0c;其被 N 个‘-’分隔成 N1 的子串&#xff0c;给定正整数 K&#xff0c;要求除第一个子串外&#xff0c;其余的串每 K 个用‘-’分隔&#xff0c;并将小写字母转换为大写。 输入描述 正整数 K 和‘-’分割的字符串&a…

基于单片机的指纹密码锁

【摘要】 本设计是一款基于单片机的指纹识别电子密码锁系统。该系统以STC89C52单片机作为模块核心同时结合ZFM-60指纹模块实现录取指纹并存储指纹数据的功能&#xff0c;并且通过HS12864-15C液晶显示比对流程及比对结果&#xff0c;该指纹电子密码锁通过直流继电器与发光二极管…

企业总部和分支通过GRE VPN互通

PC1可以ping通PC2 1、首先按照地址表配置ip地址 2、分别在AR1和AR3上配置nat 3、配置GRE a 创建tunnel接口&#xff0c;并选择tunnel协议为GRE&#xff0c;为隧道创建一个地址&#xff0c;用作互联 b 为隧道配置源地址或者源接口&#xff0c;这里选择源接口&#xff1b;再为…

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测 目录 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测。 程序设计 完整代码&#xff1a;回…