服务配置

GriffinScript 使用配置文件,扩展了语言的能力,具备使用外部服务的能力。
目前可以使用四种服务:HTTP/HTTPS服务,HSF服务,TOP服务,系统服务。

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <profile xmlns="http://cainiao-inc.com/iot/binding/v2">
  3. <property name="dabao_param">
  4. {
  5. "srcOrderType": "PICK_BOILL"
  6. "itemType": "SKUU"
  7. },
  8. "standardVersion": "1.0.0",
  9. "lang": "zh"
  10. }
  11. </property>
  12. <property name="dabao_header">
  13. {
  14. "Content-Type":"application/json"
  15. "Accept":"application/json"
  16. }
  17. </property>
  18. <property name="labor_header">
  19. {
  20. "Content-Type":"application/json"
  21. }
  22. </property>
  23. <service class="com.cainiao.loginx.edge.adapter.HttpAdapter" name="labourService" baseUrl="https://example.com">
  24. <function name="graySwitch" path="/api/labour/grayswitch" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
  25. <function name="checkNumber" path="/api/labour/checknumber" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
  26. <function name="beginWork" path="/api/labour/beginwork" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
  27. <function name="endWork" path="/api/labour/endwork" headers="${labor_header}" method="POST" defaultParams="${dabao_param}"/>
  28. </service>
  29. <service class="com.cainiao.loginx.edge.adapter.HsfAdapter" name="loginService" hsfVersion="1.0.0" hsfTimeout="3000" hsfInterface="com.***.CnUserLoginService">
  30. <function name="refreshSession" hsfName="refreshSession" paramTypes="com.cainiao.iots.api.dataobject.login.CnUserRefreshSessionRequest"/>
  31. <function name="login" hsfName="login" paramTypes="com.cainiao.iots.api.dataobject.login.CnUserLoginRequest"/>
  32. </service>
  33. <bean class="com.cainiao.loginx.edge.SystemService" name="sys"/>
  34. <bean class="com.cainiao.digit.edge.driver.lemo.LaborService" name="laborService"/>
  35. </profile>

入参辅助配置

HTTP/HTTPS服务,支持入参辅助配置。
把部分参数配置在jsonBinding中,GriffinScript中的json数据与jsonBinding数据合并,简化外部服务调用时的参数传递。
如应正常传递{"standardVersion": "1.0.0", "lang": "zh"},配置jsonBinding为{``"standardVersion": "1.0.0"},在调用时仅需要传{"lang": "zh"}即可。参数冲突时已GriffinScript的数据为准。

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <profile xmlns="http://cainiao-inc.com/iot/binding/v2">
  3. <property name="dabao_param">
  4. {
  5. "srcOrderType": "PICK_BOILL"
  6. "itemType": "SKUU"
  7. },
  8. "standardVersion": "1.0.0",
  9. "lang": "zh"
  10. }
  11. </property>
  12. <property name="dabao_header">
  13. {
  14. "Content-Type":"application/json"
  15. "Accept":"application/json"
  16. }
  17. </property>
  18. <property name="labor_header">
  19. {
  20. "Content-Type":"application/json"
  21. }
  22. </property>
  23. </profile>

在GS中调用服务

  1. var params = {};
  2. var header = {};
  3. var response = labourService.login(params, header);
  4. var param1 = "key1";
  5. var param2 = {
  6. key1: value1,
  7. key2: value2
  8. }
  9. var hsfResponse = loginService.login(param1, param2);
  10. sys.print(123, 345);

HTTP/HSF服务重试机制

image.png

  1. // HTTP/HSF服务的执行结果作为入参
  2. function retryFunction(serviceResponse){
  3. // do something
  4. return true; // 重新执行服务调用
  5. // return false; // 不执行服务调用
  6. }
  7. // httpService 是在profile.xml中配置的HTTP服务
  8. httpService.setRetryHandler(retryFunction);

数据打印

可以在 LEMO STUDIO 的模拟器控制台查看数据

  1. sys.print("hello gs");

时间日期

  1. var now = new Date();
  2. now.setHours(0, 0, 0, 0); //hour, minute, seconds, milliseconds
  3. var today = now.format("yyyy-MM-dd");
  4. var todayTime = now.format("yyyy-MM-dd HH:mm:ss");
  5. var yesterdayTime = new Date();
  6. yesterdayTime.setDate(yesterday.getDate()-1); //day
  7. var yesterday = yesterdayTime.format("yyyy-MM-dd");

加密算法

  1. <bean class="com.cainiao.loginx.edge.ext.MessageDigest" defaultCharset="UTF-8" algorithm="MD5" name="MD5"/>
  2. <bean class="com.cainiao.loginx.edge.ext.Base64" defaultCharset="UTF-8" name="Base64"/>
  3. <bean class="com.cainiao.loginx.edge.ext.PublicKeyEncryption" algorithm="RSA"
  4. transformation="RSA/ECB/PKCS1Padding"
  5. keySpec="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8H6Gp7XP6UvEQzvUgGnt9nPX4exn1aNlmeyloMl6g2rEggeTNMp7I3iLPzQDbt6yedCru971fducKc2DgF/y2CcwAdqaKdxm0dSI2Zs4QLNYbKwWJ65wkgUh8+TJBnk+PGTgoxZ2wzvhJyRGjGhsFvLmZkUYPPxAPSNfjB3+/4wIDAQAB"
  6. name="RSA"/>
  1. var base64 = Base64.encode("text");
  2. var text = Base64.decode(base64);
  3. let var1 = MD5.digest("some text data"); // return byte array
  4. let var2 = MD5.digest("some other text", "GBK"); // return byte array
  5. let var3 = MD5.digestHex("some text data"); // return hex string
  6. RSA.encrypt("data"); // returns BASE64 encoded data

获取应用列表(登陆流程)

  1. <bean name="appService" interface="com.cainiao.digit.edge.driver.lemo.LemoAppListService"/>

登陆流程DEMO

  1. var res = labor.launch(apps, "测试用户", optionMap);

国际化文案

提供一个tr方法,脚本按如下方式使用

  1. var locale = 'zh_CN'; // 从设备或者物流节点信息获取locale
  2. sys.setLocale(locale); // 在当前context设置locale
  3. var desc1 = sys.tr("这是一个需要在界面上展示的中文描述");
  4. var desc2 = sys.tr("这是另一个需要界面上展示的中文描述");
  5. var desc3 = sys.tr("Title:集包:拣选");
  6. var desc4 = sys.tr("这是一个{}模版", name); // 这是一个占位符模版
  7. var desc5 = sys.tr("{1}本书一共{0,number,currency}。", money, number);
  8. // var desc5 = tr("这是一个" + name + "模版"); // 这种写法不支持
  9. // var desc = tr("这是一个") + name + tr("模版"); // 此写法会影响翻译,不建议使用
  10. // var desc4 = tr(`这是一个${a + b}模版`); // 此占位符方式Griffin Script暂不支持

image.png

  • 应用名称的国际化,系统会自动生成一条应用名的默认文案,直接修改即可。
  • 国际化配置修改后需要重新部署,包括应用名称文案的配置。