微信扫码
添加专属顾问
我要投稿
深入探索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) {
// 设置超时时间 300s
SseEmitter 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_id
boolean 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-04-29
Dify 平台集成 Palo Alto Networks 安全插件,为 AI 应用注入企业级安全防护
2025-04-29
Dify→ LLM 节点 说明
2025-04-28
速看!最新版 Dify 连接 Ollama 与 vLLM 全攻略
2025-04-27
Docker 部署 dify 连接 ollama 模型报错?
2025-04-27
Dify 工作流→ 节点及相关功能
2025-04-26
关于一次dify的渗透
2025-04-26
基于dify开发一个数据可视化分析小助手
2025-04-25
dify v1.3.0发布:插件自动更新、Mermaid优化,AI开发更高效!
2024-12-24
2024-04-25
2024-07-16
2024-07-20
2024-04-24
2024-06-21
2024-05-08
2024-11-15
2024-05-09
2024-08-06
2025-04-27
2025-04-15
2025-03-20
2024-12-19
2024-09-13
2024-09-13
2024-08-28
2024-04-24