微信扫码
添加专属顾问
我要投稿
深入探索Java与Dify工作流API的集成实践,掌握企业级AI应用的关键技术。 核心内容: 1. 基于Dify工作流的Java对接流程与实战案例 2. 接口测试与工作流发布的关键步骤 3. Java代码对接Dify工作流的详细指南
public class WorkFlowController {private WorkFlowService workFlowService;/*** 上传文件** @param file* @return* @throws IOException*/public WorkFlowFileVo upload( MultipartFile file) throws IOException {return workFlowService.upload(file);}/*** 执行工作流** @param workFlowRunDto* @return*/public SseEmitter runWorkFlow( WorkFlowRunDto workFlowRunDto) {return workFlowService.runWorkFlow(workFlowRunDto);}/*** 获取工作流执行情况** @param workflowRunId* @return*/public WorkFlowExeVo workFlowRunInfo(String workflowRunId) {return workFlowService.workFlowRunInfo(workflowRunId);}}
public interface WorkFlowService {/*** 上传文件** @param file* @return*/public WorkFlowFileVo upload( MultipartFile file) throws IOException;/*** 执行工作流** @param workFlowRunDto* @return*/public SseEmitter runWorkFlow( WorkFlowRunDto workFlowRunDto);/*** 获取工作流执行情况** @param workflowRunId* @return*/public WorkFlowExeVo workFlowRunInfo(String workflowRunId);}
/*** 上传文件** @param file* @return* @throws IOException*/public WorkFlowFileVo upload(MultipartFile file) throws IOException {// 设置请求头HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);headers.set("Authorization", difyConfig.getSaveDataAuthorization());// 创建请求实体MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();// 处理文件内容body.add("file", new ByteArrayResource(file.getBytes()) {public String getFilename() {// 返回原始文件名return file.getOriginalFilename();}});HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);String uploadUrl = difyConfig.getSaveDataUrl() + "/files/upload";// 发送请求ResponseEntity<String> response = restTemplate.exchange(uploadUrl, HttpMethod.POST, requestEntity, String.class);log.info("上传文件的response: {}", response);WorkFlowFileVo workFlowFileVo = JSON.parseObject(response.getBody(), WorkFlowFileVo.class);// 构建工作流请求体WorkFlowRunDto workFlowRunDto = buildWorkFlowRunDto(workFlowFileVo.getId());// 执行工作流this.runWorkFlow(workFlowRunDto);}
/*** 执行工作流** @param workFlowRunDto* @return*/public SseEmitter runWorkFlow(WorkFlowRunDto workFlowRunDto) {// 设置超时时间 300sSseEmitter emitter = new SseEmitter(300_000L);// 使用异步线程处理流式响应ExecutorService executor = Executors.newSingleThreadExecutor();executor.execute(() -> {try {String runUrl = difyConfig.getSaveDataUrl() + "/workflows/run";log.info("runUrl: {}", runUrl);// 创建请求头HttpHeaders headers = new HttpHeaders();headers.set("Authorization", difyConfig.getSaveDataAuthorization());headers.setContentType(MediaType.APPLICATION_JSON);// 设置接收流headers.set(HttpHeaders.ACCEPT, MediaType.TEXT_EVENT_STREAM_VALUE);HttpEntity<WorkFlowRunDto> requestEntity = new HttpEntity<>(workFlowRunDto, headers);// 使用restTemplate的execute方法处理流式响应restTemplate.execute(runUrl,HttpMethod.POST,request -> {// 关键修复:手动设置Content-Type和请求头request.getHeaders().setContentType(MediaType.APPLICATION_JSON);request.getHeaders().addAll(requestEntity.getHeaders());// 写入请求体if (requestEntity.getBody() != null) {new ObjectMapper().writeValue(request.getBody(), requestEntity.getBody());}},response -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(response.getBody()))) {// 标记是否已处理workflow_run_idboolean workflowRunIdProcessed = false;String line;while ((line = reader.readLine()) != null) {if (line.startsWith("event: ping")) {// 跳过心跳事件continue;}emitter.send(line);log.info("line: {}", line);if (!workflowRunIdProcessed) {try {workflowRunIdProcessed = processLine(line);} catch (Exception e) {log.error("记录id出现异常: {}", e.getMessage());emitter.completeWithError(e);}}}}emitter.complete();return null;});} catch (Exception e) {log.error("处理过程中发生错误: {}", e.getMessage());emitter.completeWithError(e);} finally {log.info("流式输出结束...");}});// 关闭线程池executor.shutdown();log.info("流式输出完成...");return emitter;}
public WorkFlowExeVo workFlowRunInfo(String workflowRunId) {log.info("获取到的工作流id: {}", workflowRunId);// 设置请求头HttpHeaders headers = new HttpHeaders();headers.set("Authorization", difyConfig.getWorkFlowAuthorization());String workFlowInfoUrl = difyConfig.getWorkFlowUrl() + "/workflows/run/" + workflowRunId;HttpEntity<String> requestEntity = new HttpEntity<>(headers);// 发送请求ResponseEntity<String> response = restTemplate.exchange(workFlowInfoUrl, HttpMethod.GET, requestEntity, String.class);log.info("response: {}", response);return JSON.parseObject(response.getBody(), WorkFlowExeVo.class);}
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-12-14
Aiops探索:用Dify做一个基于LLM的ChatOps,从此我们的运维工作变得超级轻松
2025-12-13
告别慢检索!Dify知识库调优指南:既快又准的平衡艺术
2025-12-10
Dify v1.10.1升级到Dify v1.10.1-fix.1遇到了唯一问题!
2025-12-08
核弹级漏洞!Dify中招,刻不容缓,立即修复!
2025-12-05
【紧急预警】Dify 用户速看:Next.js 爆 CVSS 10.0 核弹级漏洞,已被真实验证攻击
2025-12-05
Dify v1.10.1-fix.1 版本紧急发布!
2025-12-04
Dify v1.10.1 VS Langchain v1.1.0性能测试结果,你绝对想不到!
2025-12-03
给 Dify 架构做“减法”,Dify × OceanBase 解锁一体化数据库
2025-10-13
2025-12-05
2025-10-12
2025-09-23
2025-11-09
2025-11-11
2025-12-08
2025-09-30
2025-11-20
2025-12-05
2025-11-29
2025-09-30
2025-09-23
2025-09-06
2025-09-05
2025-08-29
2025-08-18
2025-08-02