我想在带有Kotlin的Spring WebFlux上的REST API中集中记录请求和响应。到目前为止,我已经尝试过这种方法
@Bean fun apiRouter() = router { (accept(MediaType.APPLICATION_JSON) and "/api").nest { "/user".nest { GET("/", userHandler::listUsers) POST("/{userId}", userHandler::updateUser) } } }.filter { request, next -> logger.info { "Processing request $request with body ${request.bodyToMono<String>()}" } next.handle(request).doOnSuccess { logger.info { "Handling with response $it" } } }
此处请求方法和路径成功登录,但正文为Mono,那么我应该如何记录呢?是否应该相反,我必须订阅请求正文Mono并将其记录在回调中?另一个问题是ServerResponse此处的接口无法访问响应主体。我怎么在这里买?
Mono
ServerResponse
我尝试过的另一种方法是使用 WebFilter
WebFilter
@Bean fun loggingFilter(): WebFilter = WebFilter { exchange, chain -> val request = exchange.request logger.info { "Processing request method=${request.method} path=${request.path.pathWithinApplication()} params=[${request.queryParams}] body=[${request.body}]" } val result = chain.filter(exchange) logger.info { "Handling with response ${exchange.response}" } return@WebFilter result }
同样的问题在这里:请求正文是Flux,没有响应正文。
Flux
是否可以通过某些过滤器访问完整的请求和响应以进行日志记录?我不明白什么
这或多或少类似于Spring MVC中的情况。
在Spring MVC中,您可以使用AbstractRequestLoggingFilter过滤器和 ContentCachingRequestWrapper和/或ContentCachingResponseWrapper。这里有很多折衷:
AbstractRequestLoggingFilter
ContentCachingRequestWrapper
ContentCachingResponseWrapper
ContentCaching*WrapperWebFlux中不存在类,但是您可以创建类似的类。但请记住以下几点:
ContentCaching*Wrapper
DataBuffer
您问题的其他答案:
flatMap
doOn