Задать вопрос
@turdubekov
Студент

Как логировать тело ошибочных http ответов?

Инструменты:
Spring boot + Java 11
http клиент: WebClient

@Configuration
public class WebClientConfig {

    @Bean
    public HttpClient httpClient(){
        return HttpClient.create()
                .responseTimeout(Duration.ofSeconds(5));
    }

    @Bean
    public WebClient webClient(){
        HttpClient client = httpClient();
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(client))
                .build();
    }
}


Вопрос:
Есть несколько http запросов в партнерский API, как залогировать тело ошибок в одном месте в ввиде json?

пример запроса:
private Mono<TwoFactorAuthResponse> retrieveTwoFactorTokenDetails(String accessToken, UserCredentials credentials) {
        String uri = buildTokenUri();
        return webClient.post()
                .uri(uri)
                .headers(headers -> headers.setBearerAuth(accessToken))
                .bodyValue(credentials)
                .retrieve()
                .onStatus(HttpStatus::is4xxClientError, response -> Mono.error(new UserNotRegisteredException(USER_NOT_REGISTERED_MESSAGE)))
                .onStatus(HttpStatus::is5xxServerError, response -> Mono.error(new ParnerEx(SERVER_ERROR_MESSAGE)))
                .bodyToMono(TwoFactorAuthResponse.class);
    }
  • Вопрос задан
  • 238 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@turdubekov Автор вопроса
Студент
Решил сделать через фильтр, вдруг кому-нибудь пригодится:
@Slf4j
@Component
public class LoggingExchangeFilterFunction  implements ExchangeFilterFunction {

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
        return next.exchange(request)
                .doOnNext(response -> {
                    HttpStatus status = response.statusCode();
                    if (status.is4xxClientError() || status.is5xxServerError()){
                        logErrorResponse(request, response);
                    }
                });
    }

    private void logErrorResponse(ClientRequest request, ClientResponse response) {
        log.error("Error response for request: {} {}", request.method(), request.url());
        log.error("Response status: {}", response.statusCode());
        response.bodyToMono(String.class)
                .doOnNext(body -> log.error("Response body: {}", body))
                .subscribe();
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xez
@xez
TL Junior Roo
После
.retrieve()
Попробуйте .log() воткнуть
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы