页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

本章将以restful api调用为例,介绍如何通过后端脚本调用DWF内置的Java类库和第三方restful api服务。

1 基本概念

1.1 后端脚本调用Java类库方法

DWF的后端脚本虽然使用javascript作为自身的主要开发语言,但实际上,后端脚本的运行是允许开发者调用java的类库,因此,理论上可以实现大部分Java可以实现的后端功能。为了实现Java调用,需要遵循一些调用模式,具体如下:

类的引用和对象实例化

在java中引用类的方式,使用:import "类的全路径"的方式实现,在脚本中使用Java.type实现:

...

代码块
languagejs
var FileClass = Java.type('java.io.File');
var file = new FileClass("myFile.md");

对象属性访问和函数调用

在脚本中访问对象的属性和访问和java中访问的方式是一样的,例如:

...

代码块
languagejs
var file = new (Java.type('java.io.File'))("test.md");
var fileName = file.getName();

访问集合对象

除了对单个对象的访问以外,还可以访问集合对象,例如:数组、键值表等,如下面的代码所示:

...

关于在后端脚本调用java类的方法可以参考这个文档:https://www.graalvm.org/reference-manual/js/JavaInteroperability/

1.2 后端脚本调用restful api

了解脚本调用Java的方法以后,接下来看看在后端调用restful api的方法。DWF后端采用java开发,没有一个浏览器的环境内置的restful api调用,所以,正确的方式是利用springboot提供的restful api调用方式实现对第三方服务的调用。

...

然后新建了一个完整的请求对象,即:Java.type('org.springframework.http.HttpEntity'),初始化的时候给出请求体和请求头。

this.restTemplate发出请求获得结果

最后,通过RestTemplate类实现常见的REST请求的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求。

...

注:有关springboot中包含的restful api调用和具体的使用方法,可以去springboot官网查看,也可以直接在搜索引擎中搜索,网上有大量例程。

2 举例:调用图像识别服务自动获取车型信息

接下来,以百度人工智能服务为例,介绍如何实现DWF与公开的车辆识别人工智能服务集成

2.1 百度人工智能服务简介

车辆识别服务是百度开放的系列人工智能服务之一,只需要到百度人工智能官方网站上注册开发者信息即可获得500次/天的免费使用权限:  

...

代码块
languagejs
{
	"log_id": "7283145783899943812",
	"location_result": {
		"width": 1088.4970703125,
		"top": 259.20935058594,
		"height": 524.55328369141,
		"left": 355.90838623047
	},
	"color_result": "绿色",
	"result": [
		{
			"score": 0.50806790590286,
			"name": "丰田陆地巡洋舰(LandCruiser)",
			"year": "2016"
		},
		{
			"score": 0.47251385450363,
			"name": "丰田兰德酷路泽",
			"year": "2016-2017"
		},
		{
			"score": 0.0039114798419178,
			"name": "雷克萨斯LX",
			"year": "2017"
		},
		{
			"score": 0.0011331264395267,
			"name": "丰田霸道",
			"year": "2018"
		},
		{
			"score": 0.00070912146475166,
			"name": "丰田卡罗拉(Corolla)(科罗拉)",
			"year": "2017"
		}
	]
}

2.2 批量识别集成

理解了百度人工智能服务的作用之后,可以考虑在设备第一步先做一个批量识别功能,如下图所示,点击设备列表

...

在DWF中,可以新建一个操作,将动作设置为Implement,然后选择后端脚本,输入上述脚本即可实现调用。

图-设置后端操作

2.3 全局函数设定

上述代码里出现的carAi,drawRestult每次都重复出现在脚本中,能不能不用每次都在脚本里重复出现呢?在DWF中提供了全局脚本设置可实现这一目标:

...

如上图所示,新增全局脚本之后,后端脚本可以直接调用函数实现代码的复用。

2.4 识别图像输出

除了识别结果之外,百度的车辆识别API还能输出被识别出来的区域所在四角坐标,那么这种效果也可以集成到DWF之中,如下图所示:

图-将识别后的图片附加到设备上

识别图像的输出

实现上述效果需要用到java内置的作图专用的Graphs类:Java.type('java.awt.Graphics'),其提供了在内存中绘制图片drawImage,并且在图片上绘制矩形框drawRect,文字等一系列函数。

...

代码块
languagejs
var obj = this.obj;
if (obj) {
    var r = carAi(obj.oid, 'Asset', 'assetImg');
    if (r){
        var tmpPath = drawResult(obj, 'Asset', 'assetImg', r);
        if (tmpPath){
            // 根据情况更新对象,例如:
            obj.assetDesc = r.color_result + r.result[0].name; //识别出车型信息
            this.omf.edit(obj, 'Asset');
            this.omf.setLocalFile(obj.oid, 'Asset', 'assetImgIdentified', tmpPath);
            this.res = obj.id;
        }
    }
}

前端配合刷新

在表单中放入一个oprAi的操作,中文名可以设为“车辆识别-后端”,点击测试一下可以看到识别成功,但是图片没有刷新,这是因为附件插件没动态响应能力,因此需要在前端主动刷新。具体操作的方式是再增加一个前端操作,在操作中调用脚本激活后端操作,等后端操作执行完毕后强制刷新。

...

再次新建一个按钮,将此前端操作作为按钮点击的事件,点击后识别完毕可以实现主动刷新。

3 小结

本章着重介绍了如何通过后端脚本调用Java类库和第三方restful api服务,如何实现全局脚本调用,并且以百度人工智能服务的集成为例介绍了如何在车辆识别服务中嵌入图像识别功能。