java - Spring WebFlux WebClient:接收部分响应
问题描述
我使用 WebClient (spring webflux) 发送一些信息,并不真正关心响应,只是记录它。如果它很大,我不需要读取所有内容,而只需 500 字节左右。据我了解 bodyToMono() 将整个身体读入内存。如何只得到一个身体的开始?
client.post()
.syncBody(payload)
.retrieve()
.bodyToMono(String.class)
.subscribe( r -> logResponce(r),
t -> logException(t));
解决方案
这是我能做到的最好的:
WebClient client = WebClient.create("http://www.example.com/");
client.post()
.syncBody("test")
.exchange()
.flatMap(response->response.body((t,m)->t.getBody().next()))
.subscribe( r -> {
System.out.println("Available bytes:" + r.readableByteCount());
final int limit = r.readableByteCount() < 500 ? r.readableByteCount() : 500;
System.out.println("Limit:" + limit);
byte[] dst = new byte[limit];
r.asByteBuffer().get(dst, 0, limit);
System.out.println("body=" + new String(dst, StandardCharsets.UTF_8));
},
t -> System.out.println(t));
它消耗第一个数据块并打印前 500 个字符。
推荐阅读
- reactjs - 无法删除 AWS Amplify Auth
- reactjs - 在 Office Fabric UI 中最大化或最小化对话框
- apache-spark-sql - ALTER TABLE table ADD IF NOT EXISTS PARTITION (state = '34' , city = '123') 没有在 temp/local 文件夹中添加分区
- php - Wordpress 小部件错误 - 未捕获的错误:在 null 上调用成员函数 get_header_transparency()
- mysql - 从 BigQuery 中的查询中提取/获取视图中使用的表名及其各自的列
- anylogic - 如何基于 AnyLogic 模型的输出构建数据库
- python - 有没有办法恢复我的 conda 命令?
- vue.js - NuxtJS 静态站点常规选项
- logstash - Logstash 中的配置错误
- html - 按钮拒绝留在滚动 div