Как я могу войти "настоящие" заголовки Http на WebClient - PullRequest
1 голос
/ 08 ноября 2019

В настоящее время я использую ExchangeFilterFunction для регистрации всех заголовков, которые находятся внутри экземпляра ClientRequest, и я обращаюсь к ним, выполняя request.headers().

После того, как мой фильтр будет выполнен, нижняя строка HttpClient добавляет определенные заголовки, такие как Accept-Encoding, таким образом, не попадая в журнал, так как они никогда не добавляются в экземпляр ClientRequest.

Мой фильтр выглядит следующим образом:

public class WebClientLoggingFilter implements ExchangeFilterFunction {

    @Override
    public Mono<ClientResponse> filter(final ClientRequest clientRequest, final ExchangeFunction next) {
         return Mono.just(clientRequest)
               .doOnNext(request -> log(request.headers().toString()))
               .flatMap(next::exchange)
               .doOnNext(clientResponse -> logData(clientRequestData, message, clientResponse));
  } 
}

Этот фильтр регистрирует все внутри ClientRequest заголовков, но затем HttpClient выполняет свою магию, которая никогда не поступает в ClientRequest, даже послеответ вернулся. Пример кода от Нетти.

Есть ли какой-либо другой способ ведения журнала, чтобы я мог получить доступ к тому, что он действительно отправляет по сети?

1 Ответ

2 голосов
/ 08 ноября 2019

Вместо использования фильтра я бы порекомендовал использовать стандартные средства ведения журнала, добавив эти строки в resources/application.properties:

spring.http.log-request-details=true
logging.level.org.springframework.web.reactive.function.client.ExchangeFunctions=TRACE

Однако по умолчанию заголовки по-прежнему будут отображаться как {headers masked}(поскольку они могут содержать конфиденциальные данные). Чтобы включить ведение журнала заголовка для клиента, вы должны явно включить его на каждом WebClient следующим образом:

return WebClient
        .builder()
        .exchangeStrategies(ExchangeStrategies.builder().codecs(c ->
                c.defaultCodecs().enableLoggingRequestDetails(true)).build()
        )
        .build()
        //carry on using the webclient as normal

Затем вы получите вывод, подобный следующему:

HTTP POST https://a.com/ea, headers=[Content-Type:"application/json", Accept:"application/json", Authorization:"Bearer token blah"]
...