首页 > 解决方案 > Spring WebFlux WebClient:接收部分响应

问题描述

我使用 WebClient (spring webflux) 发送一些信息,并不真正关心响应,只是记录它。如果它很大,我不需要读取所有内容,而只需 500 字节左右。据我了解 bodyToMono() 将整个身体读入内存。如何只得到一个身体的开始?

client.post()
   .syncBody(payload)
   .retrieve()
   .bodyToMono(String.class)
   .subscribe( r -> logResponce(r),
               t -> logException(t));

标签: javawebclientspring-webflux

解决方案


这是我能做到的最好的:

    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 个字符。


推荐阅读