
我希望在两个设备之间调用函数并传参,担心参数格式不对导致崩溃。请问在 HarmonyOS 的分布式能力中,如何在远程调用前做参数校验?
```ts
function safeCall(fn, args) {
if (!Array.isArray(args)) throw new Error('invalid');
return fn(...args);
}
```

1. 使用分布式数据对象的序列化与反序列化机制校验
HarmonyOS的分布式数据对象(Distributed Data Object, DDO)支持自动序列化和反序列化,可在数据传输前强制校验参数格式。
-
步骤:
-
定义数据类时,使用
@ohos.data.distributedDataObject
注解,并指定字段类型和约束(如范围、非空)。 -
在远程调用前,序列化过程会自动检查参数是否匹配定义的结构,如果不匹配则抛出异常。
-
-
示例代码:
TypeScript
// 定义分布式数据对象,添加参数校验 import distributedDataObject from '@ohos.data.distributedDataObject'; @Observed class RequestParams { userId: number = 0; // 必须为数字 command: string = ''; // 必须为非空字符串 @Range(1, 100) priority: number = 1; // 添加范围校验注解 } // 创建分布式对象 let ddo = distributedDataObject.create({ params: new RequestParams() }); // 远程调用函数前,设置参数并自动校验 function remoteCall() { try { ddo.params = { userId: 100, command: "start", priority: 50 }; // 有效参数,通过校验 // 执行远程调用(如ddo.save()或分布式任务调度) } catch (error) { console.error("参数校验失败: " + error.message); // 捕获无效参数异常 } }
-
校验失败处理:序列化时若参数类型不符或超出
@Range
定义的范围,系统抛出BusinessError
,可在调用前捕获并处理,避免崩溃。
2. 在分布式任务调度中集成运行时校验
通过分布式任务调度(Distributed Scheduler)远程调用函数时,可在任务触发前添加自定义校验逻辑。
-
步骤:
-
在定义远程Ability时,使用
want
参数传递数据,并在onConnect
回调中手动校验want
中的参数。 -
利用HarmonyOS的
util
模块(如util.types
)进行类型检查或自定义校验函数。
-
-
示例代码:
TypeScript
import Ability from '@ohos.app.ability.UIAbility'; import util from '@ohos.util'; export default class RemoteAbility extends Ability { onConnect(want) { // 参数校验函数 function validateParams(params) { if (!util.types.isNumber(params.userId)) { throw new Error("userId必须为数字"); } if (params.priority < 1 || params.priority > 100) { throw new Error("priority超出范围 (1-100)"); } return true; } try { const callParams = want.parameters; // 获取传递的参数 validateParams(callParams); // 执行校验 // 校验通过后执行业务逻辑 } catch (error) { console.error("远程调用中止: " + error.message); // 阻断无效调用 } return ...; // 返回连接对象 } }
-
校验失败处理:校验异常后直接中止调用,并通过日志或返回值通知调用方,防止远程设备崩溃。
3. 结合API设计进行静态校验
在定义远程接口时,使用TypeScript强类型或HarmonyOS的@Param
注解,在编译期或运行时强制校验。
-
方法:
-
声明接口时指定参数类型(如
interface RemoteAPI { execute(userId: number, command: string): void; }
)。 -
使用分布式能力生成桩代码(Stub),自动校验参数类型。
-
-
优势:编译期检查可提前捕获类型错误,减少运行时风险。
