Как сделать логирование response body в реактивном программировании Spring WebFlux
Только начинаю разбираться с реактивным программированием, не судите строго. Используется Spring boot, Spring WebFlux. Настраиваю логирование запросов и ответов с использованием WebFilter.
У ServerHttpRequest можно получить все, что нужно залогировать: method,url, params, body.
У ServerHttpResponse есть метод для получения кода статуса, а body нет.
Как у ServerHttpResponse можно получить body? Либо есть какой-то другой способ в WebFilter это сделать?
@Slf4j
@Component
@ConditionalOnExpression("${logging.request.enabled:true}")
public class WebLogFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange).doOnSubscribe(subscription -> {
String method = exchange.getRequest().getMethod().toString();
String url = exchange.getRequest().getURI().toString();
String requestParams = queryParamsToString(exchange.getRequest().getQueryParams());
String requestBody = exchange.getRequest().getBody().toString();
String responseBody = exchange.getResponse().; // тут хотела доставать body но нет такого метода
String status = Integer.toString(Objects.requireNonNull(exchange.getResponse().getStatusCode()).value());
log.info("""
\n
method: {}
url: {}
request params: {}
request body: {}
response body: {}
status {}
""",
method, url, requestParams, requestBody, responseBody, status
);
} );
}
public static String queryParamsToString(MultiValueMap<String,String> map) {
StringBuilder sb = new StringBuilder();
map.forEach((key, value) -> sb.append(key).append("=").append(value).append(", "));
return sb.toString();
}
}