当前位置: 首页 > article >正文

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

前言

为丰富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.kler.cn/a/500165.html

相关文章:

  • 基于开源AI智能名片2+1链动模式S2B2C商城小程序的企业数字化转型深度策略与实践
  • 【入门级】计算机网络学习
  • 力扣每日一题1月8号 字符串中最大的3位相同数字解析
  • HarMonyOS 鸿蒙系统使用 Grid构建网格
  • C#中 string.Equals 和 == 区别
  • mysql-死锁排查
  • 计算机网络 (34)可靠传输的工作原理
  • [石榴翻译] 维吾尔语音识别 + TTS语音合成
  • Lua语言的多线程编程
  • Haskell语言的数据结构
  • BurpSuite之FUZZ模糊测试
  • Swagger学习⑱——@Callback 注解
  • Cygwin, MinGW
  • (java) String 字符串
  • simulink建模与仿真代做matlab程序代编设计帮做电力电子电机控制
  • Django Admin中添加自定义按钮与默认按钮并列
  • Objective-C语言的网络编程
  • 蓝桥与力扣刷题(389 找不同)
  • 设计一篇利用python爬虫获取1688详情API接口的长篇软文
  • 芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?