(二)通过工作流实现多API调用的详细实现(包括API相关操作)

前面提到通过工作流对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栏目中介绍。

你可能感兴趣的:(Spring,Boot,ACTIVITI工作流,java,spring,boot)