今天,中原工学院的周恒恩给大家带来我的学习成果《云函数》,下面我详细给介绍一下它的开发和实现过程,希望对初学者有所帮助
概括
云函数(FaaS)是一段运行在云端的、轻量的、无关联的并且可重用的代码。无需管理服务器,只需编写和上传代码,即可获得对应的数据结果。使用云函数可以使企业和开发者不需要担心服务器或底层运维设施,可以更专注代码和业务本身,也可以使代码进一步解耦,增加其重用性。
1.准备工作
1.1 业务分析 我们需要利用云函数,在云端判断猜测是否正确,应用端只负责接收用户传入的猜测的数字和传递随机数,数字传入云函数,云函数判断是大了,还是小了,还是猜对了,并且返回应用端。 说白了,这个判断在云端完成,HarmonyOS应用侧只负责编写页面,接收数据,返回结果,不做任何判断的事情。
1.2 创建应用,创建项目 创建一个应用,并且在AppGallery Connect创建项目,注意包名一致哦! 在HarmonyOS侧的云函数集成方式,目前只能在JAVA侧,不过由于HarmonyOS存在JS,JAVA的混合开发模式,编程语言倒不是问题。
2.集成云函数服务
2.2 添加配置文件
2.2.1 我们进入到前文创建好的项目页面
2.2.2 添加进入HarmonyOS项目工程的应用级目录
2.2.3 添加依赖 进入应用级的build.gradle文件。
添加依赖, 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/目录下
我们进入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 创建云函数 我们在我的项目页面,左侧栏上找到云函数,点击进入。
点击,立即开通。
点击,创建函数,进入到创建函数页面。 这里的函数名称自拟,我们可以看到这里提供了在线编辑函数,或者上传其他编程语言的压缩包。这里我们在线进行Javascript编程。
3.2 编写云函数 我们进行在线的云函数编写。
业务代码
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 添加触发器 选择触发器,点击添加触发器
创建成功后,查看信息,找到函数的标识符号
这个名称非常重要,是我们进入函数的标识! 至此,云函数已经编写配置完成了,接下来是应用的简单编写。
- 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.结果