泛微E9 workflowService REST接口开发实战:流程增删改查完整Demo
发布时间:2026/10/2 2:44:44来源:尧图网络
简介这份资源是泛微E9 workflowService流程开发实战demo面向企业信息化开发者与流程管理初学者帮助解决流程模板增删改查与RESTful接口对接的实际问题。包内共41个文件以java源码、class编译文件、jar依赖库、xml配置为主另含key密钥与说明文档压缩包约24.75MB整体结构围绕workflow-restful-demo工程展开便于直接导入IDE运行调试。目前已有1958人学习下载说明其在泛微二次开发圈内具备一定参考价值。通过该demo可掌握流程设计、部署与实例追踪的完整链路理解如何用GET、POST、PUT、DELETE等HTTP方法操作流程资源并参考其与业务系统集成的思路实现流程自动触发与状态回写。对于需要快速上手泛微E9流程API、梳理工程目录与依赖配置的开发者而言是一份可直接复用的实践样例。1. 泛微 E9 workflowService 流程开发 demo从 REST 接口到增删改查的完整落地手上拿到一个泛微 E9 的流程开发 demo 包第一反应往往不是兴奋而是先确认它到底能不能跑、跑起来能验证什么。这个workflow-restful-demo就是冲着这个诉求来的它把 E9 workflowService 对外暴露的 REST 接口用一套可编译的 Java 工程串了起来覆盖流程的创建、查询、修改、删除四类操作。适合两类人——一类是刚接手泛微 E9 二次开发、需要一份能对照着调通的样例另一类是老手想快速确认某个接口的入参出参格式省去翻文档的时间。包里带了fastjson、httpclient、httpmime这些依赖还有一份E9流程对外APIREST.zip文档说明作者是奔着「能直接复现」去的不是丢个空壳。下面按「它是什么 → 怎么用 → 坑在哪」的顺序拆开讲。2. 拆包看结构workflow-restful-demo 的工程骨架与依赖选型2.1 目录结构与各文件职责拿到 zip 先别急着导入 IDE先把目录过一遍心里有个地图。这个 demo 的结构是典型的 Java SE 工程没有用 Maven 或 Gradle 管理依赖而是把 jar 包直接放在lib下靠 IDE 的 libraries 配置引用。workflow-restful-demo1.zip └── workflow-restful-demo ├── src │ ├── com # 业务代码REST 调用与流程操作逻辑 │ └── test # 测试入口通常含 main 方法 ├── lib # 第三方依赖 jar ├── doc # E9流程对外APIREST.zip 接口文档 ├── out # 编译输出目录 ├── .idea # IntelliJ IDEA 工程配置 │ ├── libraries # jar 依赖映射 │ ├── misc.xml │ ├── uiDesigner.xml │ ├── workspace.xml │ └── modules.xml ├── workflow-restful-demo.iml └── readme.mdsrc/com是核心流程的增删改查逻辑都在这里src/test一般放一个带main的测试类方便直接右键运行lib下的 jar 决定了你能不能用某些 APIdoc里的接口文档是排错时的第一手依据。.idea目录说明作者用的是 IntelliJ IDEA如果你用 Eclipse需要手动把lib下的 jar 加到 Build Path。2.2 依赖 jar 的作用与版本选择理由lib下的 jar 不是随便塞的每一个都有明确用途。先看清单jar 文件作用为什么是这个版本fastjson-1.2.68.jarJSON 序列化/反序列化泛微 E9 接口返回多为 JSON1.2.68 是较稳定的老版本兼容 JDK 8httpclient-4.4.1.jarHTTP 客户端发 REST 请求4.4.x 对 JDK 8 友好API 成熟httpcore-4.4.1.jarhttpclient 的底层核心必须与 httpclient 版本匹配httpmime-4.4.1.jar多部分表单上传流程附件上传场景会用到commons-logging-1.2.jar日志门面httpclient 依赖它jsdk-15.jar泛微 E9 服务端 SDK提供流程相关的基础类fel-all-0.5.jar泛微表达式引擎流程条件、公式计算会用到RSA-0.0.1-SNAPSHOT.jar加密工具接口鉴权或参数加密版本选择上httpclient 和 httpcore 必须同版本否则运行时会报NoSuchMethodError。fastjson 用 1.2.68 而不是更新的版本是因为 E9 服务端返回的 JSON 结构在某些新版本 fastjson 下解析行为有差异老版本反而稳。jsdk-15 和 fel-all-0.5 是泛微自己的包版本号跟 E9 服务端保持一致不要随意替换。2.3 导入工程与依赖配置用 IntelliJ IDEA 打开时.idea/libraries里已经配好了 jar 路径但如果你换机器或换目录路径会失效。手动配一遍更稳妥打开 IDEAFile → Open选中workflow-restful-demo目录。右键工程 →Open Module Settings→Libraries→→Java。选中lib目录下所有 jar确认添加。检查Modules→Dependencies确保这些 jar 在列表里且 scope 为Compile。如果src没有标记为 Sources Root右键src→Mark Directory as→Sources Root。用 Eclipse 的话右键工程 →Build Path→Configure Build Path→Libraries→Add JARs把lib下所有 jar 加进去。配完后src/test下的测试类应该能直接编译通过没有红色报错。提示如果导入后com包下的类报cannot resolve symbol先检查lib是否全部加入再检查 JDK 版本是否为 8。E9 的 SDK 对 JDK 8 兼容最好JDK 11 以上可能出现模块化冲突。3. 流程增删改查的 REST 调用从接口文档到可运行代码3.1 先读 doc 里的接口文档确认请求格式doc/E9流程对外APIREST.zip解压后通常是一份 PDF 或 HTML里面列了每个接口的 URL、HTTP 方法、请求头、请求体、返回体。不要跳过这一步直接看代码因为代码里的参数名必须和文档一致否则服务端直接返回错误码。常见做法是先把文档里「流程创建」「流程查询」「流程更新」「流程删除」四个接口的 URL 和参数抄出来对照src/com下的代码确认作者用的是哪套接口。泛微 E9 的 REST 接口一般走/api/workflow/前缀鉴权用 token 或 session具体以文档为准。3.2 封装 HTTP 请求工具类demo 里通常有一个HttpUtil或类似名字的类负责发 GET/POST/PUT/DELETE 请求。如果没有可以自己补一个核心是用httpclient发请求、fastjson解析返回。下面是一个可抄的骨架import org.apache.http.client.methods.*; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSONObject; public class HttpUtil { // 发送 JSON 请求method 支持 GET/POST/PUT/DELETE public static JSONObject send(String url, String method, String token, JSONObject body) throws Exception { CloseableHttpClient client HttpClients.createDefault(); HttpRequestBase request; switch (method.toUpperCase()) { case GET: request new HttpGet(url); break; case POST: request new HttpPost(url); break; case PUT: request new HttpPut(url); break; case DELETE: request new HttpDelete(url); break; default: throw new IllegalArgumentException(unsupported method: method); } // 鉴权头具体 header 名以接口文档为准 request.setHeader(Content-Type, application/json;charsetUTF-8); request.setHeader(token, token); if (body ! null !(request instanceof HttpGet)) { ((HttpEntityEnclosingRequestBase) request).setEntity( new StringEntity(body.toJSONString(), UTF-8)); } CloseableHttpResponse response client.execute(request); String result EntityUtils.toString(response.getEntity(), UTF-8); client.close(); return JSONObject.parseObject(result); } }逻辑说明HttpClients.createDefault()创建默认客户端switch根据 method 构造对应的请求对象。token放在 header 里这是泛微 E9 REST 接口常见的鉴权方式具体 header 名要对照文档有的版本用Authorization。请求体用StringEntity包装指定 UTF-8 避免中文乱码。返回结果统一用fastjson解析成JSONObject方便后续取字段。参数说明url是完整接口地址method是 HTTP 方法token是登录后拿到的凭证body是请求体GET 请求传null。如果接口要求表单格式而非 JSON需要改用UrlEncodedFormEntity这一点在文档里会写明。3.3 流程创建POST 请求与参数拼装创建流程对应 POST 请求请求体里通常包含流程名称、流程类型、创建人、表单数据等。下面是一个调用示例public class WorkflowCreate { public static void main(String[] args) throws Exception { String url http://your-e9-host/api/workflow/create; String token your-token; JSONObject body new JSONObject(); body.put(workflowName, 测试流程); body.put(workflowType, 1); // 流程类型按文档取值 body.put(creator, 1001); // 创建人 ID body.put(formData, new JSONObject()); // 表单数据按实际字段填 JSONObject resp HttpUtil.send(url, POST, token, body); // 返回体里一般有 code 和 datadata 里含新建流程的 id if (resp.getIntValue(code) 200) { String workflowId resp.getJSONObject(data).getString(id); System.out.println(创建成功流程 ID: workflowId); } else { System.out.println(创建失败: resp.getString(msg)); } } }逻辑说明先拼body字段名必须和接口文档一致workflowType这类枚举值要查文档确认。发送后判断code成功则从data里取流程 ID这个 ID 是后续查询、修改、删除的钥匙。参数说明workflowName是流程实例名称creator是用户 ID 不是用户名formData是嵌套 JSON字段结构取决于流程绑定的表单。如果创建时报「字段缺失」优先检查formData里的必填项。3.4 流程查询GET 请求与分页参数查询流程一般用 GET支持按 ID 查单条或按条件查列表。列表查询通常带分页参数public class WorkflowQuery { public static void main(String[] args) throws Exception { String token your-token; // 按 ID 查单条 String urlOne http://your-e9-host/api/workflow/get?id12345; JSONObject one HttpUtil.send(urlOne, GET, token, null); System.out.println(单条查询: one.toJSONString()); // 按条件查列表带分页 String urlList http://your-e9-host/api/workflow/list?pageNo1pageSize20status1; JSONObject list HttpUtil.send(urlList, GET, token, null); System.out.println(列表查询: list.toJSONString()); } }逻辑说明GET 请求把参数拼在 URL 上pageNo和pageSize控制分页status是流程状态过滤条件。返回体里通常有total和rows或list取的时候注意字段名。参数说明pageNo从 1 开始pageSize不要设太大泛微服务端一般有上限常见是 100。如果返回total为 0 但数据库里明明有数据检查status过滤条件是否写错。3.5 流程修改与删除PUT 与 DELETE 的注意事项修改用 PUT删除用 DELETE两者都需要流程 ID。修改时请求体里只传要改的字段没传的字段服务端一般保留原值但有些版本会覆盖为 null这一点要实测确认。public class WorkflowUpdateDelete { public static void main(String[] args) throws Exception { String token your-token; String id 12345; // 修改 String updateUrl http://your-e9-host/api/workflow/update; JSONObject body new JSONObject(); body.put(id, id); body.put(workflowName, 修改后的名称); JSONObject updateResp HttpUtil.send(updateUrl, PUT, token, body); System.out.println(修改结果: updateResp.toJSONString()); // 删除 String deleteUrl http://your-e9-host/api/workflow/delete?id id; JSONObject deleteResp HttpUtil.send(deleteUrl, DELETE, token, null); System.out.println(删除结果: deleteResp.toJSONString()); } }逻辑说明修改的id放在 body 里删除的id放在 URL 上这是常见约定但不同版本可能不同以文档为准。删除前建议先查一次确认流程存在避免误删。参数说明修改时id必传其他字段按需。删除接口如果返回「流程正在运行中不允许删除」说明该流程有未结束的实例需要先终止实例再删。4. 避坑与排查泛微 E9 REST 接口调用的五个血泪经验4.1 现象请求返回 401 或「鉴权失败」原因token 过期、token 放错 header、或者服务端要求的是 session 而非 token。泛微 E9 不同版本的鉴权方式有差异有的用tokenheader有的用Authorization: Bearer xxx还有的依赖 cookie。解决先看接口文档确认鉴权方式再用 Postman 单独发一次请求排除代码问题。如果 token 过期重新登录获取。如果服务端要求 cookie需要在 httpclient 里加CookieStore把登录后的 cookie 带上。4.2 现象中文流程名称变成乱码原因请求体编码不是 UTF-8或者StringEntity没指定字符集。httpclient 默认用 ISO-8859-1中文会乱。解决new StringEntity(body.toJSONString(), UTF-8)显式指定 UTF-8同时Content-Typeheader 里加charsetUTF-8。返回体解析时EntityUtils.toString(entity, UTF-8)也要指定。4.3 现象创建流程时报「字段缺失」但字段明明传了原因字段名大小写不一致或者嵌套结构不对。泛微接口对字段名大小写敏感workflowName和workflowname是两个不同的字段。另外formData如果是嵌套对象层级错了也会报缺失。解决对照文档逐个字段核对用System.out.println(body.toJSONString())打印最终请求体和文档示例逐字比对。嵌套结构用JSONObject一层层 put不要用字符串拼。4.4 现象httpclient 报NoSuchMethodError或ClassNotFoundException原因jar 版本冲突。最常见的是 httpclient 和 httpcore 版本不一致或者工程里混入了其他版本的 httpclient。解决检查lib下 httpclient 和 httpcore 是否同为 4.4.1检查 IDEA 的External Libraries里有没有重复的 httpclient。如果有移除多余的。另外commons-logging必须存在否则 httpclient 初始化会失败。4.5 现象删除流程返回「流程正在运行中」原因该流程有未结束的实例泛微默认不允许删除有运行实例的流程定义。解决先调查询接口找到运行中的实例调终止接口结束实例再删流程定义。或者改用「禁用」而非「删除」把流程状态置为不可用。这个逻辑在接口文档里通常有说明但容易被忽略。5. 进阶用 jsdk 与 fel 做服务端扩展以及接口联调的验证习惯demo 里的jsdk-15.jar和fel-all-0.5.jar不只是摆设它们对应泛微 E9 服务端的扩展能力。jsdk 提供流程、表单、用户等基础类fel 是表达式引擎流程的条件分支、公式计算都靠它。如果你不满足于只调 REST 接口想在服务端写扩展代码这两个包是入口。常见做法是在 E9 服务端的扩展目录下建一个 Java 类实现泛微的Action或WorkflowAction接口用 jsdk 拿流程上下文用 fel 算条件。比如审批节点根据金额自动分流import com.api.workflow.WorkflowAction; import com.api.workflow.WorkflowContext; import com.fel.ExpressionEngine; public class AmountBranchAction implements WorkflowAction { Override public void execute(WorkflowContext context) { // 从流程上下文取表单字段 Object amountObj context.getFormData(amount); double amount Double.parseDouble(String.valueOf(amountObj)); // 用 fel 表达式判断也可以直接写 if String expression amount 10000 ? true : false; boolean needDirector ExpressionEngine.eval(expression); // 把结果写回流程变量供后续节点使用 context.setVariable(needDirectorApprove, needDirector); } }逻辑说明WorkflowContext是流程上下文getFormData取表单字段setVariable写流程变量。ExpressionEngine.eval是 fel 的用法实际项目中表达式通常配在流程节点上而不是硬编码。这段代码需要部署到 E9 服务端的扩展目录重启或热加载后生效。参数说明amount是表单字段名必须和表单设计器里一致。needDirectorApprove是自定义变量名后续节点用条件判断时引用它。jsdk 的类名和方法名以你手上的版本为准不同小版本可能有差异。联调时的验证习惯我一般强制走三步第一步用 Postman 或 curl 单独发一次请求确认接口本身通第二步在 Java 代码里打印完整请求 URL、header、body 和返回体和 Postman 的结果比对第三步如果返回不对先看 HTTP 状态码再看返回体里的code和msg最后才怀疑代码逻辑。这个顺序能省掉大量瞎猜的时间。还有一个容易翻车的地方泛微 E9 的 REST 接口在不同补丁版本下行为可能不同。同一个接口A 环境返回data.idB 环境可能返回data.workflowId。所以拿到 demo 后不要假设它在你环境里一定能跑通先跑一遍创建和查询确认字段名和返回结构再往下做修改和删除。从那以后我每次拿到泛微的接口 demo都先跑通「创建 查询」这条最短链路确认环境匹配了再展开。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网