当前位置: 首页 > 知识库问答 >
问题:

如何将ServerHttpRequest/ServerHttpResponse正文设置为字符串

薛元忠
2023-03-14

希望在Spring API网关上实现一个代理来记录请求/响应。我为传入的请求和传出的响应定义了自己的过滤器。

请求网关筛选器:

public class RequestGatewayFilter extends AbstractGatewayFilterFactory<RequestGatewayFilter.Config> {

private static final Logger logger = LogManager.getLogger(RequestGatewayFilter.class);

public RequestGatewayFilter() {
    super(Config.class);
}

@Autowired
CustomProxyLogger customLogger;

@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        ServerHttpRequest.Builder builder = exchange.getRequest().mutate()
                .header(PR_CORRELATION_ID, UUID.randomUUID().toString());
        ServerHttpRequest request = builder.build();
        customLogger.logRequest(logger, request);
        return chain.filter(exchange.mutate().request(request).build());
    };
}
public class ResponseGatewayFilter extends AbstractGatewayFilterFactory<ResponseGatewayFilter.Config> {

private static final Logger logger = LogManager.getLogger(ResponseGatewayFilter.class);

public ResponseGatewayFilter() {
    super(Config.class);
}

@Autowired
CustomProxyLogger customLogger;

@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            ServerHttpResponse response = exchange.getResponse();
            customLogger.logResponse(logger, exchange);
        }));
    };
}

没有一个工作...

有什么想法或可能的方法来解决这个“得到身体”的问题?

共有1个答案

殳自怡
2023-03-14

只需创建另一个过滤器并记录所有请求和响应。

    @Component
    public class RequestResponseLoggingFilter implements Filter {

...

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            LOG.info(request);
            chain.doFilter(request, response);
            LOG.info(response);
        }

    }
 类似资料:
  • 我使用的是spring boot Version-2.0.6.Release和spring cloud Version-finchley.sr2

  • 代码只是简单地将我的变量名设置为字符串“null”,所以我不知道如何让程序等待输入。编译器不允许我在不初始化变量的情况下声明它。

  • 问题内容: 我对React有点陌生,尝试将className设置为string + prop。但是我不确定该怎么做以及这是否是最佳实践。 所以我正在尝试做的,显然是行不通的,是这样的: 我该如何写呢? 问题答案: 您可以使用字符串串联 或使用新的ES2015功能

  • 我有一个枚举,我想让这些枚举类型在开关情况下成为字符串。 因此,在上面我硬编码“Mon”,而不是有一种方法,我们可以直接将枚举类型作为字符串。就目前而言,如果我在交换机案例中传递枚举类型,我将获得id 0、1或2,但我需要Mon/Tue/Wed作为字符串

  • 问题内容: 如何将类型中的字符串指针的引用值设置为空字符串?考虑以下示例: 我尝试了和运算符的所有组合都无济于事: 显然其中一些很愚蠢,但我没有发现尝试的危害。我也尝试使用和: 这会导致编译错误 恐慌:反映:使用不可寻址的值reflect.Value.SetString 我假设这是因为Go中的字符串是不可变的? 问题答案: 字符串文字不可寻址。 取包含空字符串的变量的地址: 或使用新的:

  • 问题内容: 使用JPA,可以为属性生成DDL: 将会 会屈服。 但是我怎样才能生产它呢? 是否可以使用-attribute,还是我需要使用-attribute? 问题答案: 几个月过去了,获得了新知识,所以我将回答我自己的问题: 产生最正确的结果。随着版本我使用,这将转化为类型有。由于varchar(max)可以替代textSQL Server的 较新版本,因此希望可以产生较新版本的SQL Ser