java实现调用dify工作流的接口
时间: 2025-07-11 19:59:46 浏览: 4
<think>我们被要求使用Java调用Dify的工作流API。根据引用[1]和引用[3],我们可以知道Dify的工作流API主要涉及三个操作:上传文件、执行工作流和获取工作流执行情况。引用[1]中给出了一个接口定义,引用[3]则提供了Java后端集成的项目结构和依赖。步骤:1.添加必要的依赖(Spring Web和WebFlux,以及JSON处理库如Fastjson2)。2.创建与Dify API交互的Service,实现上传文件、执行工作流和获取工作流执行情况的方法。3.配置HTTP请求,包括设置请求头(认证信息等)和请求体。具体实现:1.依赖配置(Maven):```xml<dependencies><!--Spring Web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Spring WebFluxfor reactiveprogramming(needed forSSE)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- Fastjson2for JSONprocessing --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.34</version><!--请使用最新版本--></dependency><!--其他可能需要的依赖--></dependencies>```2.创建DTO(数据传输对象)来封装请求和响应。根据引用[1]中定义的接口,我们需要:-WorkFlowRunDto:执行工作流的请求体- WorkFlowFileVo:上传文件的返回结果- WorkFlowExeVo:获取工作流执行情况的返回结果3.实现Service。注意:Dify的API需要认证,通常使用APIKey(BearerToken)进行认证。参考引用[5]的Python示例,我们可以知道在请求头中设置Authorization:Bearer {api_key}。具体方法:
a.上传文件:端点:根据引用[4],可能是类似`https://api.dify.ai/v1/datasets/{dataset_id}/document/create_by_text`,但注意引用[1]中并没有给出具体端点,因此我们需要参考Dify官方文档。不过引用[1]中定义的接口是`WorkFlowFileVoupload(@RequestParam("file") MultipartFilefile)`,所以我们可以假设上传文件的端点是Dify工作流中指定的文件上传端点(可能是`/v1/upload`?),但具体需要查阅文档。由于用户问题中并没有给出具体的上传文件端点,我们假设为`/v1/upload`(实际需要替换为正确的端点)。同时,注意使用`MultipartFile`上传。b.执行工作流:引用[2]中提到:POST /workflows/run执行workflow。所以我们可以使用这个端点。
c.获取工作流执行情况:引用[2]中提到:GET/parameters用于获取参数,但并没有直接给出获取执行情况的端点。引用[1]中定义的方法是`WorkFlowExeVoworkFlowRunInfo(String workflowRunId)`,所以我们可以假设端点为`/v1/workflow-run/{workflowRunId}`,但实际需要查看文档。由于我们无法确定具体端点,这里根据引用[1]的接口定义来设计,实际开发中需要替换为Dify官方提供的端点。实现代码示例:首先,创建DTO类:
```java// WorkFlowRunDto.javapublicclass WorkFlowRunDto {//根据实际需要的参数定义,例如:private StringworkflowId;privateMap<String, Object> inputs;//其他字段...//gettersand setters}
``````java//WorkFlowFileVo.javapublic classWorkFlowFileVo{private StringfileId;privateString fileName;//其他字段...// getters andsetters}```
```java// WorkFlowExeVo.javapublic classWorkFlowExeVo {privateString runId;privateString status;//其他字段...// getters andsetters}```然后,实现Service:
```javaimport org.springframework.core.io.FileSystemResource;
importorg.springframework.http.*;import org.springframework.util.LinkedMultiValueMap;
importorg.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import org.springframework.web.multipart.MultipartFile;
importjava.io.File;import java.io.IOException;
importjava.nio.file.Files;
importjava.nio.file.Path;@Servicepublic classWorkFlowServiceImpl implementsWorkFlowService {privatefinalRestTemplaterestTemplate= newRestTemplate();private finalString apiKey ="your-api-key"; //替换为你的DifyAPI Keyprivate finalString baseUrl ="https://api.dify.ai";// Dify API基础URL@Overridepublic WorkFlowFileVo upload(MultipartFilefile) throwsIOException {//将MultipartFile转换为临时文件PathtempFile= Files.createTempFile(null, null);file.transferTo(tempFile);//设置请求头HttpHeadersheaders =new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);headers.setBearerAuth(apiKey);//创建请求体MultiValueMap<String, Object> body= newLinkedMultiValueMap<>();body.add("file", newFileSystemResource(tempFile.toFile()));HttpEntity<MultiValueMap<String,Object>>requestEntity= newHttpEntity<>(body, headers);//发送请求ResponseEntity<WorkFlowFileVo> response= restTemplate.exchange(baseUrl+ "/v1/upload", //替换为实际的上传端点HttpMethod.POST,requestEntity,WorkFlowFileVo.class);//删除临时文件Files.delete(tempFile);returnresponse.getBody();}@OverridepublicSseEmitterrunWorkFlow(WorkFlowRunDtoworkFlowRunDto) {//执行工作流,并返回SSE事件流//由于工作流执行可能是流式的,我们使用SseEmitter来支持服务器推送事件//设置请求头HttpHeadersheaders =new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.setBearerAuth(apiKey);HttpEntity<WorkFlowRunDto>requestEntity= newHttpEntity<>(workFlowRunDto,headers);//使用RestTemplate发送请求,但注意:如果Dify的响应是流式(streaming)的,RestTemplate可能不适用,我们需要使用WebClient(响应式)来处理流式响应。//这里假设我们使用阻塞模式(非流式),那么我们可以这样://引用[2]提到:执行workflow的端点是POST/workflows/run,并且支持流式和非流式(通过response_mode指定)//根据引用[5],请求中有一个response_mode字段,可以设置为"blocking"或"streaming"。//如果设置为"blocking",则可以使用RestTemplate;如果设置为"streaming",则需要使用WebClient来处理流式响应。//由于方法返回的是SseEmitter,我们假设需要流式响应。因此,这里我们使用WebClient。//创建WebClientWebClient webClient =WebClient.create(baseUrl);SseEmitteremitter =new SseEmitter();webClient.post().uri("/workflows/run").header(HttpHeaders.AUTHORIZATION,"Bearer" +apiKey).contentType(MediaType.APPLICATION_JSON).bodyValue(workFlowRunDto).retrieve().bodyToFlux(String.class).subscribe(data-> {try{//解析每一行数据(假设是JSON字符串)//将数据发送到前端emitter.send(SseEmitter.event().data(data));} catch(IOExceptione){emitter.completeWithError(e);}},error-> emitter.completeWithError(error),()-> emitter.complete());return emitter;}@Overridepublic WorkFlowExeVoworkFlowRunInfo(String workflowRunId) {//设置请求头HttpHeadersheaders =new HttpHeaders();headers.setBearerAuth(apiKey);HttpEntity<String>requestEntity= newHttpEntity<>(headers);//发送GET请求ResponseEntity<WorkFlowExeVo> response= restTemplate.exchange(baseUrl +"/v1/workflow-run/" +workflowRunId,//替换为实际的端点HttpMethod.GET,requestEntity,WorkFlowExeVo.class);returnresponse.getBody();}}
```注意:1.上述代码中的端点URL需要替换为Dify官方提供的实际端点。2.上传文件时,我们创建了一个临时文件,然后上传。注意在请求后删除临时文件。3.对于流式执行工作流,我们使用了WebClient(SpringWebFlux)来消费流式响应,并将数据通过SseEmitter发送给前端。如果前端不需要流式,也可以改为阻塞模式,直接返回结果。4.认证信息(APIKey)需要替换为实际的。由于Dify的API文档可能更新,请以官方文档为准。以上实现基于提供的引用信息,实际开发中可能需要进行调整。相关问题:1. Dify工作流API的认证方式是什么?2.如何处理Dify工作流API的流式响应?3.如何优化Dify工作流API调用的错误处理?</think>### Java 调用 Dify 工作流 API 实现方法
根据您提供的引用内容,以下是 Java 调用 Dify 工作流 API 的完整实现方案:
#### 一、基础配置
1. **添加 Maven 依赖**
需要 Spring Web 和 WebFlux 支持流式响应:
```xml
<dependencies>
<!-- Spring Web 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- WebFlux 支持流式响应 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- JSON 处理 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.34</version>
</dependency>
</dependencies>
```
2. **配置 API 常量**
```java
public class DifyConstants {
public static final String API_BASE_URL = "https://api.dify.ai";
public static final String WORKFLOW_RUN_ENDPOINT = "/workflows/run";
public static final String API_KEY = "app-YourApiKeyHere"; // 替换实际API密钥
}
```
#### 二、核心实现类
```java
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
public class DifyWorkflowClient {
private final WebClient webClient;
public DifyWorkflowClient() {
this.webClient = WebClient.builder()
.baseUrl(DifyConstants.API_BASE_URL)
.defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + DifyConstants.API_KEY)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
/**
* 执行工作流(流式响应)
* @param request 工作流请求参数
* @return SSE 流式响应
*/
public Flux<String> runWorkflowStream(WorkflowRunRequest request) {
return webClient.post()
.uri(DifyConstants.WORKFLOW_RUN_ENDPOINT)
.bodyValue(JSON.toJSONString(request))
.retrieve()
.bodyToFlux(String.class)
.filter(data -> !data.isEmpty())
.map(this::parseStreamData);
}
/**
* 执行工作流(阻塞响应)
* @param request 工作流请求参数
* @return 完整响应结果
*/
public String runWorkflowBlocking(WorkflowRunRequest request) {
return webClient.post()
.uri(DifyConstants.WORKFLOW_RUN_ENDPOINT)
.bodyValue(JSON.toJSONString(request))
.retrieve()
.bodyToMono(String.class)
.block();
}
// 解析流式响应数据
private String parseStreamData(String rawData) {
try {
JSONObject json = JSON.parseObject(rawData);
return json.getString("answer") != null ?
json.getString("answer") :
json.toJSONString();
} catch (Exception e) {
return rawData; // 返回原始数据
}
}
/**
* 工作流请求参数类
*/
public static class WorkflowRunRequest {
private Map<String, Object> inputs;
private String response_mode = "streaming"; // 默认流式
private String conversation_id;
private String user;
// getters/setters
}
}
```
#### 三、使用示例
```java
// 1. 创建请求参数
DifyWorkflowClient.WorkflowRunRequest request = new DifyWorkflowClient.WorkflowRunRequest();
request.setInputs(Map.of("prompt", "请生成市场分析报告"));
request.setUser("user-12345");
// 2. 流式调用
DifyWorkflowClient client = new DifyWorkflowClient();
client.runWorkflowStream(request)
.subscribe(data -> System.out.println("收到数据: " + data));
// 3. 阻塞调用(适合非实时场景)
String result = client.runWorkflowBlocking(request);
System.out.println("完整结果: " + result);
```
#### 四、关键参数说明
1. **请求参数**:
- `inputs`:工作流输入参数(必填)
- `response_mode`:`streaming`(流式) 或 `blocking`(阻塞)
- `user`:用户标识(用于审计)
- `conversation_id`:会话ID(持续对话时使用)
2. **认证方式**:
```http
Authorization: Bearer app-YourApiKeyHere
```
3. **响应处理**:
- 流式响应每行都是独立 JSON 对象
- 最终事件包含 `event: message_end`
- 错误响应包含 `error` 字段
> 提示:完整 API 文档参考 Dify 官方文档[^2][^4]
阅读全文
相关推荐


















