Java Spring WebFlux WebClient:接收部分响应

Java Spring WebFlux WebClient:接收部分响应,java,webclient,spring-webflux,Java,Webclient,Spring Webflux,我使用WebClient(SpringWebFlux)发送一些信息,并不真正关心响应,只是记录它。如果它很大,我不需要读取所有内容,但只需要500字节左右。正如我所理解的,把整个身体读入记忆。如何只获得身体的开始 client.post() .syncBody(payload) .retrieve() .bodyToMono(String.class) .subscribe( r -> logResponce(r), t -> l

我使用WebClient(SpringWebFlux)发送一些信息,并不真正关心响应,只是记录它。如果它很大,我不需要读取所有内容,但只需要500字节左右。正如我所理解的,把整个身体读入记忆。如何只获得身体的开始

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));
WebClient client=WebClient.create(“http://www.example.com/");
client.post()
.syncBody(“测试”)
.exchange()
.flatMap(response->response.body((t,m)->t.getBody().next())
.订阅(r->{
System.out.println(“可用字节:+r.readableByteCount());
最终整数限制=r.readableByteCount()<500?r.readableByteCount():500;
System.out.println(“限制:+Limit”);
字节[]dst=新字节[限制];
r、 asByteBuffer().get(dst,0,限制);
System.out.println(“body=“+新字符串(dst,StandardCharsets.UTF_8));
},
t->System.out.println(t));

它消耗第一个数据块并打印前500个字符。

正如我所说,我需要开始响应,我想记录它。对,我没有抓住要点。我认为你需要使用“交换”方法和自定义BodyExtractor。我觉得这正是我需要的。但是对于所有这些警告(org.springframework.web.reactive.function.client.ClientResponse)呢:“您必须始终使用body或toEntity方法之一,以确保释放资源并避免HTTP连接池的潜在问题。”我在你的建议中看不到类似的东西。它使用response.body方法,并使用lambda作为身体提取器。t是ReactiveHttpInputMessage,t.getBody()返回通量(原始数据字节流)。t、 getBody().next()获取第一个数据缓冲区,并为第一个块返回一个Mono,然后跳过其余的块。subscribe从响应中提取前500个字节,转换为UTF_8格式的字符串并打印。因此,在某种意义上,我们使用了所有的主体(其余部分被“next”方法跳过)如果响应短于500,我们在这里得到异常。您想对您的响应执行“部分”读取吗?或者您想读取整个响应并减少记录的符号量?我需要部分读取。(以防万一有人给我发1Gb的回复)