今天,中原工学院的周恒恩给大家带来我的学习成果《云函数》,下面我详细给介绍一下它的开发和实现过程,希望对初学者有所帮助

概括

云函数(FaaS)是一段运行在云端的、轻量的、无关联的并且可重用的代码。无需管理服务器,只需编写和上传代码,即可获得对应的数据结果。使用云函数可以使企业和开发者不需要担心服务器或底层运维设施,可以更专注代码和业务本身,也可以使代码进一步解耦,增加其重用性。

1.准备工作

1.1 业务分析 我们需要利用云函数,在云端判断猜测是否正确,应用端只负责接收用户传入的猜测的数字和传递随机数,数字传入云函数,云函数判断是大了,还是小了,还是猜对了,并且返回应用端。 说白了,这个判断在云端完成,HarmonyOS应用侧只负责编写页面,接收数据,返回结果,不做任何判断的事情。

1.2 创建应用,创建项目 创建一个应用,并且在AppGallery Connect创建项目,注意包名一致哦! 在HarmonyOS侧的云函数集成方式,目前只能在JAVA侧,不过由于HarmonyOS存在JS,JAVA的混合开发模式,编程语言倒不是问题。

2.集成云函数服务

2.2 添加配置文件

2.2.1 我们进入到前文创建好的项目页面

『江鸟中原』鸿蒙-云函数_数据

2.2.2 添加进入HarmonyOS项目工程的应用级目录

『江鸟中原』鸿蒙-云函数_云函数_02

2.2.3 添加依赖 进入应用级的build.gradle文件。

『江鸟中原』鸿蒙-云函数_随机数_03

添加依赖, implementation ‘com.huawei.agconnect:agconnect-function-harmony:1.3.1.300’

dependencies {

   implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])

   testImplementation 'junit:junit:4.13.1'

   ohosTestImplementation 'com.huawei.ohos.testkit:runner:2.0.0.200'

      implementation 'com.huawei.agconnect:agconnect-function-harmony:1.3.1.300'

}

2.3 启动应用时,分配密匙 前面我们在工程文件中放入了不含密匙的配置文件,我们需要在应用启动时候分配密匙。

我们先把前文的配置文件复制一份到resources/rawfile/目录下

『江鸟中原』鸿蒙-云函数_ide_04

我们进入JAVA文件夹中,打开MyApplication进行编写。 

package com.example.random;


import com.huawei.agconnect.AGConnectInstance;

import com.huawei.agconnect.AGConnectOptionsBuilder;

import ohos.aafwk.ability.AbilityPackage;

import ohos.global.resource.RawFileEntry;

import ohos.global.resource.Resource;

import ohos.global.resource.ResourceManager;


public class MyApplication extends AbilityPackage {

   @Override

   public void onInitialize() {

       super.onInitialize();

       in();

   }

   private void in(){

       //添加如下代码

       try {

           AGConnectOptionsBuilder builder = new AGConnectOptionsBuilder();

           ResourceManager resourceManager = getResourceManager();

                       RawFileEntry rawFileEntry =  resourceManager.getRawFileEntry("resources/rawfile/agconnect-services.json");

           Resource resource = rawFileEntry.openRawFile();

           builder.setInputStream(resource );

                 builder.setClientId("865143442517281664");

           builder.setClientSecret("6CDCF90B48310A1A80DF1B818848133BF3AE1EA8A61BE09C628894B262E7FC93");

           builder.setApiKey("DAEDADSYJyrB0DwxGwAReXl8nyYuCugvsdM4iCRmgf+jZhm+vzyPf+ViiznkGCTSI51Tv9JzxVpQlTjJuddZnqu9VuQ3nymhk8M7MA==");

           AGConnectInstance.initialize(this, builder);

       } catch (Exception e) {

           e.printStackTrace();

       }

   }

}


2.4 添加权限!!!!! 进入config.json文件 在"abilities"下添加

{
    "permissions": [
      "com.huawei.agconnect.core.DataAbilityShellProvider.PROVIDER"
    ],
    "name": "com.huawei.agconnect.core.provider.AGConnectInitializeAbility",
    "type": "data",
     //com.yzj.card 此处为自己工程的包名
    "uri": "dataability://com.yzj.card.AGConnectInitializeAbility"
  }


3.编写云函数

3.1 创建云函数 我们在我的项目页面,左侧栏上找到云函数,点击进入。

『江鸟中原』鸿蒙-云函数_ide_05

点击,立即开通。

『江鸟中原』鸿蒙-云函数_ide_06

点击,创建函数,进入到创建函数页面。 这里的函数名称自拟,我们可以看到这里提供了在线编辑函数,或者上传其他编程语言的压缩包。这里我们在线进行Javascript编程。

『江鸟中原』鸿蒙-云函数_随机数_07

3.2 编写云函数 我们进行在线的云函数编写。

『江鸟中原』鸿蒙-云函数_数据_08

业务代码

let myHandler = function(event, context, callback, logger) 
  
{ 
    var res = new context.HTTPResponse(context.env, { 
            "res-type":"context.env", 
        "faas-content-type":"json", 
},"application/json", "200"); 
     //定义一个全局变量,接收用户传来的数据
    var guess_num; 
      //定义一个全局变量,接收应用端生成的随机数
    var random_num;
    //random_num = Math.ceil(Math.random()*100); 
    if (event.body) { 
        //如果传过来的是一个对象 那么解析,获取对应数据。
        var _body = JSON.parse(event.body); 
        //设置随机数
        random_num =_body.random_num;
       //当前猜测的数据 
       guess_num = _body.guess_num; 
    } else { 
        guess_num = event.guess_num; 
    } 
    //定义一个变量 用来返回结果
    var result="";
    //执行猜测函数
    result = randNumgame(guess_num);
    res = result; 
    //返回结果
    context.callback(res); 
  
    function randNumgame (inputNum) { 
        var resultString; 
    //判断猜测数据是否合法
    if (!isNumber(inputNum)) { 
        resultString = "input is not a number"; 
    } else { 
        var remainder = inputNum; 
         //大于正确数据
        if(remainder>random_num)
            resultString="大了";
        //等于正确数据
        else if(remainder ==random_num)
            resultString = "正确"
        else
            resultString = "小了"
    } 
    //返回字符串结果
    return resultString; 
} 
    //判断数据是否合法
    function isNumber (input) { 
    if (parseInt(input).toString == "NaN") { 
        return false; 
    } else { 
        return true; 
    } 
} 
} 
  
; 
  
module.exports.myHandler =myHandler;
function randNumgame (inputNum) { 
    var resultString; 
//判断猜测数据是否合法
if (!isNumber(inputNum)) { 
    resultString = "input is not a number"; 
} else { 
    var remainder = inputNum; 
     //大于正确数据
    if(remainder>random_num)
        resultString="大了";
    //等于正确数据
    else if(remainder ==random_num)
        resultString = "正确"
    else
        resultString = "小了"
} 
//返回字符串结果
return resultString;

}

3.3 添加触发器 选择触发器,点击添加触发器

创建成功后,查看信息,找到函数的标识符号

这个名称非常重要,是我们进入函数的标识! 至此,云函数已经编写配置完成了,接下来是应用的简单编写。

  1. HarmonyOS侧应用 4.1 启动云函数功能 启动云函数功能,只需要实例化AGConnectFunction即可

private AGConnectFunction function; function = AGConnectFunction.getInstance(); 1 2 我们对云函数的调用都是通过function实现的

4.2 调用云函数 private void getWeek(int num) {

HashMap<String,Integer> map = new HashMap();
    //两个对象,分别对应JS云函数中的 random_num  和 guess_num
    map.put("random_num",random_num);
    map.put("guess_num", num);
    /*
    注意! 这里的“guess-test” 就是我们在触发器配置信息里面的标识
     */
    function2.wrap("guess-$latest").call(map)
            .addOnCompleteListener(new OnHarmonyCompleteListener<FunctionResult>() {
                @Override
                public void onComplete(HarmonyTask<FunctionResult> task) {
                    if (task.isSuccessful()) {
                        //获取返回值,对应JS云函数中的res
                        String value = task.getResult().getValue();
                        HiLog.info(LABEL,value);
                        tx.setText(value);
                        //如果正确 再刷新随机数
                        if(value=="正确"){
                            random_num=new Random().nextInt(100);
                        }

                    } else {
                        Exception e = task.getException();
                        if (e instanceof AGCFunctionException) {
                            AGCFunctionException functionException = (AGCFunctionException) e;
                            int errCode = functionException.getCode();
                            String message = functionException.getMessage();
                            HiLog.error(LABEL,message);
                        }
                        // ...
                    }
                }
            });
}


super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);
    //启动AGC服务
    start();
    //生成随机数
    Random r = new Random();
    random_num = r.nextInt(100);
    //测试控件
    textField = (TextField) findComponentById(ResourceTable.Id_tf);
    btn = (Button) findComponentById(ResourceTable.Id_btn);
    tx= (Text) findComponentById(ResourceTable.Id_tx);

    //绑定事件,点击一次进行数字猜测
    btn.setClickedListener(new Component.ClickedListener() {
        @Override
        public void onClick(Component component) {
            getWeek(Integer.parseInt(textField.getText()));
            HiLog.info(LABEL, String.valueOf(Integer.parseInt(textField.getText())));
        }

    });

}

private void start(){
    //启动函数
    try {
        function2= AGConnectFunction.getInstance();
    } catch (Exception e) {
        e.printStackTrace();

    }
}
private void getWeek(int num) {

    HashMap<String,Integer> map = new HashMap();
    //两个对象,分别对应JS云函数中的 random_num  和 guess_num
    map.put("random_num",random_num);
    map.put("guess_num", num);
    /*
    注意! 这里的“guess-test” 就是我们在触发器配置信息里面的标识
     */
    function2.wrap("guess-$latest").call(map)
            .addOnCompleteListener(new OnHarmonyCompleteListener<FunctionResult>() {
                @Override
                public void onComplete(HarmonyTask<FunctionResult> task) {
                    if (task.isSuccessful()) {
                        //获取返回值,对应JS云函数中的res
                        String value = task.getResult().getValue();
                        HiLog.info(LABEL,value);
                        tx.setText(value);
                        //如果正确 再刷新随机数
                        if(value=="正确"){
                            random_num=new Random().nextInt(100);
                        }

                    } else {
                        Exception e = task.getException();
                        if (e instanceof AGCFunctionException) {
                            AGCFunctionException functionException = (AGCFunctionException) e;
                            int errCode = functionException.getCode();
                            String message = functionException.getMessage();
                            HiLog.error(LABEL,message);
                        }
                        // ...
                    }
                }
            });
}
@Override
public void onActive() {
    super.onActive();
}

@Override
public void onForeground(Intent intent) {
    super.onForeground(intent);
}

}

5.结果

『江鸟中原』鸿蒙-云函数_ide_09