如何在Camunda脚本任务中访问输入JSON变量及修改响应JSON
解决Camunda Script Task访问Postman传入变量及修改响应JSON问题
一、解决变量访问报错问题
直接写id2报错是因为Camunda流程变量不会直接暴露为脚本的全局属性,必须通过execution对象获取。根据你传入参数的方式,分两种场景处理:
场景1:Postman将JSON键作为独立流程变量传入
如果你的Postman请求是按Camunda标准格式,把每个键作为单独变量传入(比如调用/process-definition/{key}/start接口),请求体示例:
{ "variables": { "id2": { "value": "12345678", "type": "String" } } }
在Script Task的Groovy脚本中,通过execution.getVariable()获取变量值:
// 获取传入的id2变量 def id2Value = execution.getVariable("id2") println id2Value // 输出12345678
场景2:Postman将整个JSON作为单个JSON类型变量传入
如果你把整个JSON作为一个变量传入,请求体示例:
{ "variables": { "inputPayload": { "value": "{\"id2\":\"12345678\"}", "type": "Json" } } }
Camunda 7.10+版本会自动将Json类型变量解析为Map,直接访问键即可:
// 获取已解析的JSON变量 def payload = execution.getVariable("inputPayload") println payload.id2 // 输出12345678
如果是低版本Camunda,变量是JSON字符串,需要手动解析:
import groovy.json.JsonSlurper def payloadStr = execution.getVariable("inputPayload") def payload = new JsonSlurper().parseText(payloadStr) println payload.id2 // 输出12345678
二、修改响应JSON的方法
Camunda默认的流程启动接口返回流程实例信息,要自定义响应可以用以下两种方式:
方式1:设置流程输出变量,后续接口获取
在Script Task中构造自定义响应内容,保存为流程变量:
// 构造自定义响应JSON def customResponse = [ "code": 200, "message": "处理成功", "data": [ "processId": execution.processInstanceId, "originalId": execution.getVariable("id2"), "processedId": execution.getVariable("id2") + "_handled" ] ] // 将响应内容存入流程变量 execution.setVariable("customResponse", customResponse)
流程启动后,调用/process-instance/{processInstanceId}/variables/customResponse接口,即可获取这个自定义的JSON响应。
方式2:自定义REST接口(推荐复杂场景)
如果需要在流程启动时直接返回自定义响应,可以编写Camunda REST扩展或独立的Spring Boot接口:
- 在接口中接收Postman的请求参数
- 调用Camunda API启动流程并传入变量
- 处理变量后构造自定义JSON返回给Postman
示例简化代码(Spring Boot环境):
@PostMapping("/start-process") public ResponseEntity<Map<String, Object>> startProcess(@RequestBody Map<String, Object> request) { // 构造Camunda流程变量 Map<String, Object> variables = new HashMap<>(); variables.put("id2", request.get("id2")); // 启动流程 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("your-process-key", variables); // 构造自定义响应 Map<String, Object> response = new HashMap<>(); response.put("status", "success"); response.put("processInstanceId", processInstance.getId()); response.put("processedData", request.get("id2") + "_processed"); return ResponseEntity.ok(response); }
内容的提问来源于stack exchange,提问作者ktibor
相关产品推荐
相关产品推荐

