前面提到通过工作流对API进行编排从而实现多API调用,但是没有对创建的工作流封装成API,而是通过流程启动的形式使用,本文将介绍并且具体实现关于API的相关操作。
首先定义API实体类OpenAPIData,这里以OpenAPI3.0规范举例,包括APIName(名字)、OpenAPI(版本)、APIInfo(说明)、APIMethod(方式)、APIPath(路径)、RequestBody(请求体)以及Result,然后编写对应的get、set方法。
然后编写Controller实现业务逻辑,如查看全部API。
@ResponseBody
@GetMapping("/FindAllAPI")
public CommonResult<OpenAPIData> FindAllAPI() {
List<OpenAPIGroup> openAPIData = apiService.findAllApi();
if (openAPIData != null) {
return new CommonResult(200, "查询成功", openAPIData);
} else {
return new CommonResult(404, "查询失败", "not found");
}
}
@ResponseBody
@PostMapping("/SaveAPI")
public CommonResult SaveAPI(@RequestBody OpenAPIData openAPIData) {
System.out.println(openAPIData);
object = apiService.saveApi(openAPIData);
if (object != null) {
System.out.println(openAPIData);
return new CommonResult(200, "更新成功", openAPIData);
} else {
return new CommonResult(500, "更新失败", null);
}
}
@ResponseBody
@PostMapping("/InsertAPI")
public CommonResult InsertAPI(@RequestBody OpenAPIData openAPIData) {
........
}
......
其中,运行API首先根据表单填入的路径进行查询,查询到API相关信息后,拼凑出完整的请求地址
@ResponseBody
@GetMapping("/findApiByName/{apiName}")
public CommonResult<OpenAPIData> findAPIByName(@PathVariable("apiName") String apiName) {
OpenAPIData openAPIData = apiService.findAPIByName(apiName);
System.out.println(apiName);
if (openApiGroup != null) {
return new CommonResult(200, "查询成功", openAPIData);
} else {
return new CommonResult(404, "查询失败", "not found");
}
}
@ResponseBody
@SentinelResource(value = "complete", blockHandler = "deal_complete")
public CommonResult<OpenAPIData> complete(@RequestBody OpenAPIData openAPIData) {
String paths = openAPIData.getPaths();
String apiName = openAPIData.getAPIName();
String temple_path = paths.substring(1);//去掉"/"符号
Object result = null;
CommonResult result_API = findApiByName(apiName);
System.out.println("result:" + result_API);
由于返回的是json字符串
{
"code":200,"message":"success","data":"this is server:8001"
}
因此拼接地址时首先转化成json进行处理
JSONObject jsonObject = new JSONObject(result_api.getData());
......
String servers = (String) jsonObject.get("servers");
String url = "http://" + servers + paths;
String method = (String) jsonObject.get("methods");
......
result = ApiComplete.interfaceUtil(url, "");//最后调用工具类方法远程访问API,该方法参考上文介绍的工作流实现多API调用。
return new CommonResult(200, "运行成功", result);
至此,API的基础操作如增删改查运行已经实现完毕。
接着下来将工作流创建的流程封装成API,其实也很简单,将该函数打包成Restful接口就行。
@ResponseBody
@GetMapping("/complete/{modelID}")
public CommonResult completeTaskAPI(@PathVariable String modelID) {
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey(modelID) //流程Key
.list();
.....
commonResult = CompeleteApiAPI(task.getName(), "");
return commonResult;
}
封装一个complete函数,接收一个modelID参数,该参数为新建流程的ID,然后一个新的流程API(内部包含编排多个API节点的API)便封装成功(/complete/testDemo),最后将此API按照普通API操作那样操作即可。
关于工作流的部分将后续在ACTIVITI栏目中介绍。