JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

如何通过http调用dify的agent开放的api接口(java篇)

wys521 2025-05-21 17:10:32 精选教程 6 ℃ 0 评论

背景

如果有这样的需求,java微服务访问aget的api做一些数据操作,具体应该怎么做呢?考虑以下问题:

  • 使用什么工具?
  • 参数如何封装?
  • agent只接收流式模式,就是那种一个字一个字往外面蹦,那java又应该使用什么样的代码来接收呢?

第一个思路

假设你不知道,那就先啥也别想了,整理好自己的问题,然后直接询问deepseek,指不定就有现成的代码直接能用,我使用问小白试了试,给的示例操作步骤还是很清晰的


思路二:直接使用下面的代码

从ai拿过来的代码还是需要自己本地测试验证的,我自己做了测试通过了,在这里直接给大家分享

指定的agent返回json数据

{
  "items": "x",
  "log": "x",
  "explanation": "x"
}

导入pom

我是用的springboot,所以没加版本

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

通过接口触发调用agent的api

@PostMapping("getInformation")
public R getInformation(@RequestBody Map<String, Object> inputBean) {
	new Thread(() -> {
		try {
			DifyService.callDifyStreaming("你好,你是谁?);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}).start();
	return R.data();
}

DifyService访问

注意修改自己的地址和apikey

public class DifyService {
	private static final String DIFY_URL = "http://localhost/v1/chat-messages";
	private static final String API_KEY = "Bearer agent密钥";

	public static void callDifyStreaming(String query) throws InterruptedException {
		// 构建请求体
		DifyRequestBean requestBody = new DifyRequestBean();
		requestBody.setQuery(query);
		requestBody.setInputs(Collections.emptyMap());
		requestBody.setResponse_mode("streaming");
		requestBody.setUser("abc-123");
		requestBody.setFiles(Collections.emptyList());

		// 创建WebClient
		WebClient client = WebClient.builder()
			.baseUrl(DIFY_URL)
			.defaultHeader("Authorization", API_KEY)
			.defaultHeader("Content-Type", "application/json")
			.build();

		// 发送流式请求
		Flux<String> responseStream = client.post()
			.contentType(MediaType.APPLICATION_JSON)
			.bodyValue(requestBody)
			.retrieve()
			.bodyToFlux(String.class);

		// 处理流式响应
		CountDownLatch latch = new CountDownLatch(1);
		StringBuffer responseBuilder = new StringBuffer();
		responseStream.subscribe(
			data -> {
				StreamResponse streamResponse = JSONObject.parseObject(data, StreamResponse.class);
				String answer = streamResponse.getAnswer();
				if (ObjectUtils.isNotEmpty(answer)) {
					responseBuilder.append(answer);
				}
			},
			error -> {
				System.err.println("发生错误: " + error.getMessage());
				latch.countDown();
			},
			() -> {
				System.out.println("最终回答:" + responseBuilder);
				FinalResponseData streamResponse = JSONObject.parseObject(decode, FinalResponseData.class);
				streamResponse.setQuery(query);
				System.out.println(streamResponse.getLog());
				ListToExcel.generateExcel(Collections.singletonList(streamResponse), "D:\\" + DateUtil.now().getTime() + ".xlsx");
				latch.countDown();
			}
		);
		latch.await();
	}
}

使用以上代码能够直接访问agent获取json数据,然后处理结果。

但是这里有个问题,就是这个Java代码一次只能处理一个query,如果我有业务需要,一次有几十个query需要处理,即使我用for遍历循环,处理速度也是很慢的。有没有办法能够同时处理几十个请求,提高效率呢

后面有机会给大家分享!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表