我正在编写一个 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
标头。
我不想避免它 - 我想按原样获取压缩数据,无需任何操作,只需接收带有原始字节的实体。
目前我正在最后进行阻止,只是为了测试并确保客户端的行为符合我的预期。
有人对如何处理这个问题有任何想法吗?
提前致谢!
我试图为客户找到一些可以说明减压的内容,但我没有找到任何相关内容。
我遇到了类似的场景,我想为各种压缩场景编写单元测试,但是,WebTestClient 始终返回解压缩的响应。这是我访问原始响应以及原始标头的解决方法。
@Honey 你能想出其他替代方案吗?
在 WebClient 上禁用压缩。这将禁用响应解压缩以及“Accept-Encoding=gzip”请求标头。
@Bean
public WebClient webClient() {
return WebClient
.builder()
**.clientConnector(
new ReactorClientHttpConnector(HttpClient.create().compress(false)))**
.build();
}
手动添加“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);
});
}