基于拦截 HTTP 请求的,日志记录与重试补偿的工具。
@Resource
private RestTemplate restTemplate;
// 普通 RestTemplate 请求
String result = restTemplate.exchange("url", HttpMethod.GET, null, String.class);
// 使用 LogContext 包装后的 RestTemplate 请求
String result2 = LogContext.log().execute(() -> {
return restTemplate.exchange("url", HttpMethod.GET, null, String.class);
});
// log() => retry() 以后,就会生成重试任务
String result = LogContext.retry().execute(() -> {
return restTemplate.exchange("url", HttpMethod.GET, null, String.class);
});
1
heyleo 2022-09-26 10:58:20 +08:00
取了 request 的流之后,后面还能正常使用吗,可以分别试下 application/json 和 application/x-www-form-urlencoded 的流,在 controller 层还能正确取到参数吗
|
2
wolfie OP @heyleo
你说的应该是 ServletRequest 场景。 这里有判断,最外层的 ServletRequestWrapper 必须为可重复读取,不然不会读 Request Body https://github.com/wolfiesonfire/request-log/blob/master/request-log-core/src/main/java/com/wolfie/log/context/request/ServletRequestContext.java#L148~L150 |
3
heyleo 2022-09-26 11:18:54 +08:00
@wolfie 嗯嗯,是这个,我现在也是这样写的,针对 application/json 的流可以正常使用,但是针对 application/x-www-form-urlencoded 的流,controller 层拿到参数之后都为空
|
4
KevinBlandy 2022-09-26 12:35:23 +08:00
|
5
wolfie OP @heyleo
spring-boot-demo 里是可以拿到 form-post 里的 body 。 demo 里在 Filter 有对 ServletRequestWrapper 进行可重复读的包装。 https://github.com/wolfiesonfire/request-log/blob/master/request-log-spring-boot-demo/src/main/java/com/wolfie/demo/aop/ContentCachingRequestFilter.java#L22 |