服务配置
GriffinScript 使用配置文件,扩展了语言的能力,具备使用外部服务的能力。
目前可以使用四种服务:HTTP/HTTPS服务,HSF服务,TOP服务,系统服务。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<profile xmlns="http://cainiao-inc.com/iot/binding/v2">
<property name="dabao_param">
{
"srcOrderType": "PICK_BOILL"
"itemType": "SKUU"
},
"standardVersion": "1.0.0",
"lang": "zh"
}
</property>
<property name="dabao_header">
{
"Content-Type":"application/json"
"Accept":"application/json"
}
</property>
<property name="labor_header">
{
"Content-Type":"application/json"
}
</property>
<service class="com.cainiao.loginx.edge.adapter.HttpAdapter" name="labourService" baseUrl="https://example.com">
<function name="graySwitch" path="/api/labour/grayswitch" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
<function name="checkNumber" path="/api/labour/checknumber" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
<function name="beginWork" path="/api/labour/beginwork" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
<function name="endWork" path="/api/labour/endwork" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
</service>
<service class="com.cainiao.loginx.edge.adapter.HsfAdapter" name="loginService" hsfVersion="1.0.0" hsfTimeout="3000" hsfInterface="com.***.CnUserLoginService">
<function name="refreshSession" hsfName="refreshSession" paramTypes="com.cainiao.iots.api.dataobject.login.CnUserRefreshSessionRequest"/>
<function name="login" hsfName="login" paramTypes="com.cainiao.iots.api.dataobject.login.CnUserLoginRequest"/>
</service>
<bean class="com.cainiao.loginx.edge.SystemService" name="sys"/>
<bean class="com.cainiao.digit.edge.driver.lemo.LaborService" name="laborService"/>
</profile>
入参辅助配置
HTTP/HTTPS服务,支持入参辅助配置。
把部分参数配置在jsonBinding中,GriffinScript中的json数据与jsonBinding数据合并,简化外部服务调用时的参数传递。
如应正常传递{"standardVersion": "1.0.0", "lang": "zh"}
,配置jsonBinding为{``"standardVersion": "1.0.0"}
,在调用时仅需要传{"lang": "zh"}
即可。参数冲突时已GriffinScript的数据为准。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<profile xmlns="http://cainiao-inc.com/iot/binding/v2">
<property name="dabao_param">
{
"srcOrderType": "PICK_BOILL"
"itemType": "SKUU"
},
"standardVersion": "1.0.0",
"lang": "zh"
}
</property>
<property name="dabao_header">
{
"Content-Type":"application/json"
"Accept":"application/json"
}
</property>
<property name="labor_header">
{
"Content-Type":"application/json"
}
</property>
</profile>
在GS中调用服务
var params = {};
var header = {};
var response = labourService.login(params, header);
var param1 = "key1";
var param2 = {
key1: value1,
key2: value2
}
var hsfResponse = loginService.login(param1, param2);
sys.print(123, 345);
HTTP/HSF服务重试机制
// HTTP/HSF服务的执行结果作为入参
function retryFunction(serviceResponse){
// do something
return true; // 重新执行服务调用
// return false; // 不执行服务调用
}
// httpService 是在profile.xml中配置的HTTP服务
httpService.setRetryHandler(retryFunction);
数据打印
可以在 LEMO STUDIO 的模拟器控制台查看数据
sys.print("hello gs");
时间日期
var now = new Date();
now.setHours(0, 0, 0, 0); //hour, minute, seconds, milliseconds
var today = now.format("yyyy-MM-dd");
var todayTime = now.format("yyyy-MM-dd HH:mm:ss");
var yesterdayTime = new Date();
yesterdayTime.setDate(yesterday.getDate()-1); //day
var yesterday = yesterdayTime.format("yyyy-MM-dd");
加密算法
<bean class="com.cainiao.loginx.edge.ext.MessageDigest" defaultCharset="UTF-8" algorithm="MD5" name="MD5"/>
<bean class="com.cainiao.loginx.edge.ext.Base64" defaultCharset="UTF-8" name="Base64"/>
<bean class="com.cainiao.loginx.edge.ext.PublicKeyEncryption" algorithm="RSA"
transformation="RSA/ECB/PKCS1Padding"
keySpec="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8H6Gp7XP6UvEQzvUgGnt9nPX4exn1aNlmeyloMl6g2rEggeTNMp7I3iLPzQDbt6yedCru971fducKc2DgF/y2CcwAdqaKdxm0dSI2Zs4QLNYbKwWJ65wkgUh8+TJBnk+PGTgoxZ2wzvhJyRGjGhsFvLmZkUYPPxAPSNfjB3+/4wIDAQAB"
name="RSA"/>
var base64 = Base64.encode("text");
var text = Base64.decode(base64);
let var1 = MD5.digest("some text data"); // return byte array
let var2 = MD5.digest("some other text", "GBK"); // return byte array
let var3 = MD5.digestHex("some text data"); // return hex string
RSA.encrypt("data"); // returns BASE64 encoded data
获取应用列表(登陆流程)
<bean name="appService" interface="com.cainiao.digit.edge.driver.lemo.LemoAppListService"/>
var res = labor.launch(apps, "测试用户", optionMap);
国际化文案
提供一个tr方法,脚本按如下方式使用
var locale = 'zh_CN'; // 从设备或者物流节点信息获取locale
sys.setLocale(locale); // 在当前context设置locale
var desc1 = sys.tr("这是一个需要在界面上展示的中文描述");
var desc2 = sys.tr("这是另一个需要界面上展示的中文描述");
var desc3 = sys.tr("Title:集包:拣选");
var desc4 = sys.tr("这是一个{}模版", name); // 这是一个占位符模版
var desc5 = sys.tr("{1}本书一共{0,number,currency}。", money, number);
// var desc5 = tr("这是一个" + name + "模版"); // 这种写法不支持
// var desc = tr("这是一个") + name + tr("模版"); // 此写法会影响翻译,不建议使用
// var desc4 = tr(`这是一个${a + b}模版`); // 此占位符方式Griffin Script暂不支持
- 应用名称的国际化,系统会自动生成一条应用名的默认文案,直接修改即可。
- 国际化配置修改后需要重新部署,包括应用名称文案的配置。