当前位置:   article > 正文

DevEco Studio 端云协同开发之云函数_端云一体化中的云函数支持哪些操作

端云一体化中的云函数支持哪些操作

 

1 端云一体化

之前本人在OpenHarmony/HarmonyOS应用程序中集成了AppGallery Connect中的认证服务做应用程序的登录入口,而HarmonyOS 3.1 Beta1更进一步提升了开发体验,依托AppGakkery Connect的Serverless云服务开放接口,通过DevEco Studio的云开发能力,开发者可以在创建工程时通过选择云开发模板,即可体验端云一体化协同开发,关于端云一体化详细介绍可参见端云一体化开发,这里关于概念性的不在赘述。

1.1 创建端云一体化示例应用

使用DevEco Studio创建端云一体化示例应用程序HelloCloud,选择模板为Empty Ability with CloudDev。

3a8a2347e3ce1a5bfba37b3350b10503.png

端云一体化需要关联云开发资源,需要在DevEco Studio中使用已实名认证的华为开发者账号登录。

f4763997c5ffe194d51f848133b0d3d5.png

登录完成后在Team下拉框中选择开发团队,若提示以下错误信息,则说明未在AppGallery Connect中创建对应的应用,因此需要先去AppGallery Connect中创建对应的应用。点击错误信息中的AppGallery Connect链接跳转到创建应用界面。

e87ffe20dafe2ddb940b2913682e9ae5.png

首先添加一个项目,然后添加一个应用,配置如下:

6ee2e9938c3cd1e4359d31165bdccb78.png

在AppGallery Connect中创建应用完成后,回到DevEco Studio创建工程向导,工程向导会自动查询该组织下,包名下的云端相匹配的应用信息。

6728fe8b6946fe8bbe2fd3a57babba83.png

HelloCloud工程创建完成后,在主界面Project页签中会显示详细工程目录,包括端开发工程(Application)、云开发工程(CloudProgram)、端侧公共库(External Libraries)。

ea38c340c0c15186a23e1a869dc219f8.png

  • 端开发工程主要用于开发应用端侧业务代码;

  • 云开发工程主要用于为端侧应用用到的云函数、云数据库等。
    • clouddb:云数据库工程目录

    • cloudfunctions:云函数工程目录

创建端云一体化应用程序并关联云开发资源后,DevEco Studio会自动初始化配置并开启云开发相关服务,如认证服务、云函数、云数据库、云托管、API网关。服务开通状态可在Event Log窗口查看,也可以在AppGallery Connect控制台查看。

相较于我之前发布的集成AppGallery Connect认证服务实现登录而言,端云一体化开发更加便捷,创建应用完成后会端侧应用自动集成agconnect-services.json配置文件以及相关云服务最新版本HarmonyOS SDK,云端自动集成云数据库SDK。

8f90246a060e329d87a632db8bc898e5.png

e1a9329cc9b98bf4f74c2d6f4c0a9851.png

b3d8b36a6530cb26e937da63df74640b.png

1.2 端云一体化开发体验

使用端云一体化开发,可以让团队协同开发更简单,同时可以更大程度节省企业开发成本。接下来以云函数为例,更多请参见官网。

1.2.1 创建云函数

打开云端工程,在cloudfunctions目录右键选择New --> Cloud Function,输入云函数名称,自动生成ts文件。

99c429ecfbda68b6b57da7337e639070.png

云函数创建完成后需要在function-config.json函数配置文件中配置触发器(会自动完成HTTP触发器配置),当前可配置HTTP、CLOUDDB、AUTH、CLOUDSTORAGE、CRON五种触发器,每种触发器配置规则不同。HTTP触发器属性如下所示:

参数说明
type触发器类型,配置为"http"
enableUriDecode触发器是否启用decode。
true:启用;
false:不启用。
authFlag是否鉴权,默认为true。
authAlgor鉴权算法,默认为HDA-System。
authTypeHTTP触发器的认证类型。
apigw-client:API客户端鉴权(Client)端适用。
cloudgw-client:API客户端鉴权(Server端适用)。

在函数入口文件addition-test.ts中完善函数业务逻辑。

  1. // myHandler为入口方法名称
  2. // event 调用方法传递的事件对象,JSON格式
  3. // context 函数运行时上下文对象,封装了日志接口、回调接口、环境变量env对象等
  4. // callback 事件处理结果
  5. // logger 记录日志
  6. let myHandler = async function (event, context, callback, logger) {
  7.   // do something here
  8.   let res = new context.HTTPResponse({
  9.     "faas-content-type""json"
  10.   }, "application/json""200");
  11.   var body = {
  12.     code0,
  13.     message: "",
  14.     datanull
  15.   }
  16.   var _body = JSON.parse(event.body);
  17.   var username = _body.username;
  18.   var password = _body.password;
  19.   if (username !== 'admin') {
  20.     body.code = 10001;
  21.     body.message = "账号不存在!";
  22.   } else if (username === 'admin' && password !== '123456') {
  23.     body.code = 10002;
  24.     body.message = "密码错误!";
  25.   } else {
  26.     body.code = 200;
  27.     body.message = "登录成功!";
  28.     body.data = {
  29.       username: username
  30.     }
  31.   }
  32.   res.body = body;
  33.   callback(res);
  34. };
  35. export { myHandler };

1.2.2 部署函数

完善函数代码之后,可以将函数部署到AppGallery Connect控制台,支持单个部署和批量部署。其中单个部署选中具体需要部署的函数,批量部署则选中cloudfunctions目录,右键选择Deploy Function进行部署。

部署完成后,可在AppGallery Connect控制台中云函数服务页面查看。

28eb078f43c3a9d54083ca9996a0ebb4.png

1.2.3 编写运行测试示例

ets/services目录下编写云函数回调方法:

  1. // services/ArgAlgFunc.ts
  2. import agconnect from '@hw-agconnect/api-ohos';
  3. import "@hw-agconnect/function-ohos";
  4. import { getAGConnect } from './AgcConfig';
  5. export function login(context, reqBody: any): Promise<any> {
  6.     return new Promise((resolve, reject) => {
  7.         getAGConnect(context);
  8.         let functionResult;
  9.         let functionCallable = agconnect.function().wrap('argalg-$latest');
  10.         functionCallable.call(reqBody).then((ret: any) => {
  11.             functionResult = ret.getValue();
  12.             resolve(functionResult);
  13.         }).catch((error: any) => {
  14.             reject(error);
  15.         })
  16.     })
  17. }

ets/pages目录下构建调用云函数页面:

  1. import { login } from '../services/ArgAlgFunc';
  2. import prompt from '@system.prompt';
  3. @Entry
  4. @Component
  5. struct ArgAlg {
  6.   @State result: string = "";
  7.   @State username: string = "";
  8.   @State password: string = "";
  9.   getFunctionResult = () => {
  10.     let reqBody = {
  11.       "username": this.username,
  12.       "password": this.password
  13.     }
  14.     login(getContext(this), reqBody).then((ret) => {
  15.       this.result = JSON.stringify(ret)
  16.       if (ret.body.code === 200) {
  17.         prompt.showToast({
  18.           message: `登录成功,当前账号为:${ret.body.data.username}`,
  19.           duration: 5000
  20.         })
  21.       } else {
  22.         prompt.showToast({
  23.           message: `登录失败,原因为:${ret.body.message}`,
  24.           duration: 5000
  25.         })
  26.       }
  27.     }).catch((err) => {
  28.       this.result = JSON.stringify(err);
  29.       prompt.showToast({
  30.         message: `出现异常,原因为:${err}`,
  31.         duration: 5000
  32.       })
  33.     })
  34.   }
  35.   build() {
  36.     Column() {
  37.       TextInput({ placeholder: '请输入用户名'})
  38.         .fontSize(16).placeholderFont({ size16 })
  39.         .onChange((valuestring=> {
  40.           this.username = value;
  41.         })
  42.       TextInput({ placeholder: '请输入密码'})
  43.         .fontSize(16).placeholderFont({ size16 })
  44.         .onChange((valuestring=> {
  45.           this.password = value;
  46.         })
  47.       Button('登录')
  48.         .width(200).height(54)
  49.         .fontSize(16)
  50.         .onClick(() => {
  51.           this.getFunctionResult();
  52.         })
  53.       Text(`Info: ${this.result}`).fontSize(16)
  54.     }
  55.     .width('100%').height('100%')
  56.     .padding({ top16 })
  57.   }
  58. }

注:需要更改EntryAbility.tsonWindowStageCreate()方法中初始加载页面为pages/ArgAlg。切记在调用云函数的时候,需要发布一个正式版本才能够响应。

1.3 运行效果

8c71015e6d1043d4ba07cab4d34df60f.png

ebb30ad17279106d931e91a0c19b9ff3.png

43f7419e421c22eed4e873e02e1292cc.png

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/720156
推荐阅读
相关标签
  

闽ICP备14008679号