Spring WebFlux - 配置客户端不解压数据

问题描述 投票:0回答:1

我正在编写一个 Spring 项目,我想使用反应式编程。 我从创建一个客户端 bean 开始:

@Bean
public WebClient webClient() {
    return WebClient
            .builder()
            .build();
}

之后我创建了一个向动态 URI 发送请求的代码:

public Mono<Response> reactiveSendRequest(String body, URI url, String method, HttpHeaders headers) {
    return webClient
            .method(HttpMethod.valueOf(method.toUpperCase()))
            .uri(url)
            .bodyValue(body)
            .headers(h -> h.addAll(headers))
            .retrieve()
            .toEntity(byte[].class)
            .timeout(this.timeout)
            .map(rawResponse -> {
                return new Response(rawResponse);
            });

我正在将响应实体包装到 Response 对象中,我们可以忽略这部分。

我的应用程序应该充当代理,这意味着我想以相同的方式从我向其发送请求的端点获取数据。 我正在向返回数据 gzip 的端点发送响应,并接受带有 gzip 值的编码标头,看起来客户端正在解压缩数据,并且还从响应中删除

content-encoding
标头。 我不想避免它 - 我想按原样获取压缩数据,无需任何操作,只需接收带有原始字节的实体。

目前我正在最后进行阻止,只是为了测试并确保客户端的行为符合我的预期。

有人对如何处理这个问题有任何想法吗?

提前致谢!

我试图为客户找到一些可以说明减压的内容,但我没有找到任何相关内容。

spring spring-webflux reactive-programming
1个回答
0
投票

我遇到了类似的场景,我想为各种压缩场景编写单元测试,但是,WebTestClient 始终返回解压缩的响应。这是我访问原始响应以及原始标头的解决方法。

@Honey 你能想出其他替代方案吗?

  1. 在 WebClient 上禁用压缩。这将禁用响应解压缩以及“Accept-Encoding=gzip”请求标头。

    @Bean
    public WebClient webClient() {
      return WebClient
        .builder()
        **.clientConnector(
          new ReactorClientHttpConnector(HttpClient.create().compress(false)))**
        .build();
    }
    
  2. 手动添加“Accept-Encoding=gzip”请求标头。这将确保服务器以压缩的有效负载进行响应,但客户端不会解压缩它。

    public Mono<Response> reactiveSendRequest(
      String body, URI url, String method, HttpHeaders headers) {
      return webClient
        .method(HttpMethod.valueOf(method.toUpperCase()))
        .uri(url)
        .bodyValue(body)
        .headers(h -> h.addAll(headers))
        .header("Accept-Encoding", "gzip")
        .retrieve()
        .toEntity(byte[].class)
        .timeout(this.timeout)
        .map(rawResponse -> {
          return new Response(rawResponse);
        });
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.