当前位置: 首页 > 知识库问答 >
问题:

如何在Spring WebClient中拦截http流量?

微生新翰
2023-03-14

如何在WebFilter请求从DTO转换为JSON字符串之后拦截它们?

WebClient.builder().defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).filter(logRequest()).build();

private ExchangeFilterFunction logRequest() {
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
        LOGGER.info(clientRequest.body()); //body is MyRequest.class
        return Mono.just(clientRequest);
    });
}

MyRequestDto dto;
client.post().uri(url).syncBody(dto).retrieve().bodyToMono(MyResponseDto.class).block();

反过来,在响应从JSON转换为dto之前拦截它们。

共有1个答案

奚飞星
2023-03-14

JacksonEncoder在Databuffer中以字符串而不是字节的形式写入数据。截获请求的一种方法是重写JSON编码器,直接访问DataBuffer或将其解释为字符串

Consumer<ClientCodecConfigurer> consumer = configurer ->
        configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder() {
            @Override
            public Flux<DataBuffer> encode(Publisher<?> inputStream, DataBufferFactory bufferFactory, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
                return super.encode(inputStream, bufferFactory, elementType, mimeType, hints)
                        .doOnNext(dataBuffer -> System.out.println(StandardCharsets.UTF_8.decode(dataBuffer.asByteBuffer()).toString()));
            }
        });

WebClient webClient = WebClient.builder()
        .exchangeStrategies(ExchangeStrategies.builder().codecs(consumer).build())
        .build();

如果目的只是记录传出的消息正文,请参见以下问题:如何记录Spring 5 WebClient调用

 类似资料:
  • 我正在使用servlet 3.0和Jetty编写HTTPS代理服务器。 如何在码头处理HTTPS Connect? 目前我正在使用jetty maven插件,我的插件配置如下- 是-我想在同一端口上处理HTTP和HTTPS。当我启动Jetty时,一切都很好- 我对doGet和doPost进行了@覆盖,当我发送HTTP请求时,这两种方法都很好。但是当客户端发送HTTPS Connect时,它们都不会

  • 问题内容: 我看到 一吨 的条目在我的Tomcat日志(样品粘贴下面)。这些在几个月前进行次要版本升级(Spring Security 4.2.4,IIRC)后开始出现在我的日志文件中,因此,这显然是默认情况下启用的Spring新安全功能。这里报告了类似的问题,但是我的问题专门涉及如何在控制器中拦截这些异常。有一个针对此问题的Spring Security错误记录(提供一种处理RequestRej

  • 我在Tomcat日志中看到大量条目(示例粘贴在下面)。在几个月前的一次小版本升级(Spring Security 4.2.4,IIRC)后,这些功能开始出现在我的日志文件中,因此这显然是Spring中默认启用的一个新的安全特性。这里报告了一个类似的问题,但我的问题具体涉及如何在控制器中拦截这些异常。这个问题有一个Spring Securitybug(提供一种处理RequestRejectedExc

  • 配置拦截器 declarations: [ AppComponent ], HttpClientModule ], providers: [ [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } ] bootstrap:

  • 我使用的是Spring boot 2.2.9,我在获取401 HTTP错误的入口点时遇到问题,我正在尝试更改响应的行为,就像我们可以使用Spring错误处理程序(ResponseEntityExceptionHandler类)处理其他HTTP错误一样,谢谢

  • 问题内容: 我知道如何拦截所有请求,但是我只想拦截来自我资源的请求。 有谁知道如何做到这一点? 问题答案: 如果只想拦截来自特定资源的请求,则可以使用可选的action 属性。Angular的文档请参见此处(用法>操作) 的JavaScript Plunker:http ://plnkr.co/edit/xjJH1rdJyB6vvpDACJOT?p=preview