javaweb调用dify接口并流式返回
dify的接口就是sse接口。
流式返回就是以sse的方式返回
环境:spring-boot(spring-web)、okhttp、搭建好的dify服务器
@ApiOperation(value = "SSE示例:持续推送简单消息")@GetMapping(value = "/sse-demo", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter sseDemo() // 1.调用dify前,准备sse接口,需要直接返回SseEmitter emitter = new SseEmitter(0L);// 2.异步调用dify的工作流,使用okhttpnew Thread(() -> {// 2.1初始化OkHttpClient client = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).readTimeout(0, TimeUnit.SECONDS) // 0 表示长连接.writeTimeout(30, TimeUnit.SECONDS).build();// 2.2拼请求(这里省略,这里直接写json字符串了)Request request = new Request.Builder().url("http://172.16.1.10/v1/workflows/run").post("{" +" \"inputs\": {" +" \"uploaded_sop\": [" +" {" +" \"type\": \"document\"," +" \"transfer_method\": \"remote_url\"," +" \"url\": \"https://xxxxx.oss-cn-hangzhou.aliyuncs.com/1761187985649.docx\"" +" }" +" ]" +" }," +" \"response_mode\": \"streaming\"," +" \"user\": \"123456\"" +"}").addHeader("Accept", "text/event-stream").addHeader("Authorization", "Bearer app-yXUMZtSl1Rpl86RTq0UMnMUF").build();// 2.3发请求try (Response response = client.newCall(request).execute()) {if (!response.isSuccessful()) {emitter.completeWithError(new RuntimeException("AI服务调用失败,状态码:" + response.code()));return;}// 2.4流式读取BufferedSource source = response.body().source();while (!source.exhausted()) {String line = source.readUtf8Line();if (line == null) {break;}if (!line.isEmpty()) {emitter.send(SseEmitter.event().id(UUID.randomUUID().toString()).name("message").data(line).reconnectTime(3000));}}} catch (Exception e) {log.error("SSE 推送异常", e);emitter.completeWithError(e);} finally {emitter.complete();}}).start();// 4.直接返回return emitter;}
提示:
不能用hutool的httprequest发请求,他是同步阻塞的。就算用了bodystream也没有用。
