欢迎访问的个人博客:https://swzbk.site/,加好友,拉你入福利群
流式输出(Streaming Output)是指将数据分块逐步发送给客户端,而不是一次性发送所有数据。这种方式特别适合处理大文件、实时数据或需要逐步展示的场景(如deepseek响应、语音、视频、日志等)。在springboot中通过Spring WebFlux实现。
map
、filter
、flatMap
)处理数据流。@GetMapping("/events")
public Flux<Event> getEvents() {
return Flux.interval(Duration.ofSeconds(1))
.map(sequence -> new Event("Event " + sequence));
}
(每秒推送一个事件给客户端)Flux.just(1, 2, 3)
.map(n -> n * 2)
.filter(n -> n % 3 == 0)
.subscribe(System.out::println); // 输出:6
在 Java 中使用 OkHttp3 发送请求,并通过 Project Reactor 的 Flux
获取实时响应,通常适用于处理流式数据,比如服务器发送的实时更新或者大型数据块的逐步传输。以下为你详细介绍实现步骤并给出示例代码。
Flux
进行响应式处理。如果你使用的是 Maven 项目,在 pom.xml
中添加以下依赖:
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>4.9.3version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webfluxartifactId>
dependency>
<dependency>
<groupId>io.projectreactorgroupId>
<artifactId>reactor-coreartifactId>
<version>3.4.16version>
dependency>
dependencies>
你提供的代码片段是结合了 OkHttp3 发起异步请求和 Project Reactor 的 Flux
来处理响应结果。下面为你完善这个示例,并详细解释代码逻辑。
import okhttp3.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.FluxSink;
import java.io.IOException;
public class OkHttpFluxExample {
private static final OkHttpClient client = new OkHttpClient();
public static Flux<String> makeApiCall(Request apiRequest) {
return Flux.create(emitter -> {
try {
// 发起异步请求
client.newCall(apiRequest).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 处理请求失败的情况
System.err.println("请求 API 失败: " + e.getMessage());
emitter.error(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try (ResponseBody responseBody = response.body()) {
if (response.isSuccessful() && responseBody != null) {
// 假设响应是逐行文本数据,逐行发布到 Flux 中
String[] lines = responseBody.string().split("\n");
for (String line : lines) {
emitter.next(line);
}
// 数据发布完成,发送完成信号
emitter.complete();
} else {
// 处理响应不成功的情况
String errorMessage = "请求 API 失败,响应码: " + response.code();
System.err.println(errorMessage);
emitter.error(new IOException(errorMessage));
}
}
}
});
} catch (Exception e) {
// 处理请求过程中发生的异常
System.err.println("请求 API 时发生异常: " + e.getMessage());
emitter.error(e);
}
});
}
public static void main(String[] args) {
// 构建请求
Request apiRequest = new Request.Builder()
.url("https://example.com/api") // 替换为实际的 API 地址
.build();
// 调用 makeApiCall 方法获取 Flux
Flux<String> responseFlux = makeApiCall(apiRequest);
// 订阅 Flux 并处理响应数据
responseFlux.subscribe(
// 处理每个接收到的元素
line -> System.out.println("Received: " + line),
// 处理错误
error -> System.err.println("Error: " + error.getMessage()),
// 处理完成信号
() -> System.out.println("API 请求处理完成")
);
}
}
makeApiCall
方法:
Request
对象作为参数,返回一个 Flux
对象。Flux.create
创建 Flux
,在其回调中使用 OkHttp3 的 enqueue
方法发起异步请求。onFailure
方法:当请求失败时,打印错误信息并调用 emitter.error
方法将错误信号发送给 Flux
的订阅者。onResponse
方法:
emitter.next
方法将每行数据发布到 Flux
中。emitter.complete
方法发送完成信号。emitter.error
方法发送错误信号。main
方法:
Request
对象,指定要请求的 API 地址。makeApiCall
方法获取 Flux
。subscribe
方法订阅 Flux
,处理接收到的元素、错误和完成信号。https://example.com/api
替换为实际的 API 地址。
欢迎访问的个人博客:https://swzbk.site/,加好友,拉你入福利群