Как перехватить http трафик в Spring WebClient? - PullRequest
0 голосов
/ 11 июля 2019

Как мне перехватить WebFilter запросы после их преобразования из DTO в строку JSON?

Конечно, я мог бы добавить ExchangeFilterFunction, но clientRequest.body() показывает только мой входной объект, а непреобразованная строка 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();

Поэтому я ищу способ перехватить исходящие запросы после их преобразования из dto в строку json.

И наоборот,перехватывать ответы до они преобразуются в dto из json.

1 Ответ

1 голос
/ 11 июля 2019

Данные записываются как String, а скорее как байты в DataBuffer от JacksonEncoder. Один из способов перехватить запрос - переопределить кодировщик JSON и получить прямой доступ к DataBuffer или интерпретировать его как String.

.
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

...