微信扫码
添加专属顾问
我要投稿
深入探索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-10-30
Dify流程暂停与人工干预:3种实现方案+避坑指南
2025-10-16
告别升级噩梦:Dify 二次开发的无缝适配策略与实战案例(基于 v1.9.1)
2025-10-13
用Dify搭建企业知识库:5个实战技巧提升检索准确率90%
2025-10-13
Dify接口调用实战指南:从入门到精通的避坑手册,收藏了!
2025-10-12
Dify1.6.0升级1.9.1步骤及踩坑记
2025-10-10
用 Dify 零代码搭建 AI 用研助理,5分钟完成100个虚拟用户调研
2025-09-30
重大消息,刚刚Dify 1.9.1发布了!我们聊聊带来了哪些吸引人的功能特性?
2025-09-26
内网环境下Dify1.9.0版本镜像构建过程记录
2025-10-13
2025-09-03
2025-09-16
2025-09-06
2025-08-19
2025-09-23
2025-09-02
2025-08-18
2025-09-04
2025-10-12
2025-09-30
2025-09-23
2025-09-06
2025-09-05
2025-08-29
2025-08-18
2025-08-02
2025-07-30