返回

SpringCloud Gateway过滤器获取application/json中body数据简明指南

后端

在 Spring Cloud Gateway 中获取 application/json 请求正文

简介

Spring Cloud Gateway 是一个 API 网关,可提供微服务架构的统一入口点,并提供丰富的功能,包括路由、身份验证和速率限制。过滤器是 Spring Cloud Gateway 的重要组成部分,可拦截和处理请求和响应。

本文将探讨如何从 Spring Cloud Gateway 过滤器中提取 application/json 请求正文中的数据。我们将介绍两种方法:

1. 使用 cachedRequestBodyObject 缓存获取请求正文信息

这种方法简单易用,通过 cachedRequestBodyObject 直接获取请求正文。需要注意的是,此方法依赖缓存,如果请求正文过大,可能会导致内存溢出。

@Component
public class JsonBodyFilter implements GatewayFilter {
    @Override
    public Mono<ServerHttpResponse> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        Mono<String> body = request.getBody().cache().map(DataBufferUtils::join).map(String::new);
        return chain.filter(exchange.mutate().request(request.mutate().body(Mono.just(body))).build());
    }
}

2. 使用 ServerHttpRequest.getBody() 方法获取正文信息

这种方法相对复杂,需要通过 ServerHttpRequest.getBody() 方法获取请求正文,然后将其转换为字符串。此方法适用于请求正文较大的情况。

@Component
public class JsonBodyFilter implements GatewayFilter {
    @Override
    public Mono<ServerHttpResponse> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        Flux<DataBuffer> body = request.getBody();
        Mono<String> bodyString = body.collectList().map(DataBufferUtils::join).map(String::new);
        return chain.filter(exchange.mutate().request(request.mutate().body(Mono.just(bodyString))).build());
    }
}

结论

上述两种方法均可用于从 Spring Cloud Gateway 过滤器中获取 application/json 请求正文中的数据。开发者应根据具体需求选择合适的方法。

常见问题解答

  1. 缓存 cachedRequestBodyObject 的大小限制是多少?
    缓存的大小由 Spring Cloud Gateway 配置文件中 gateway.httpclient.max-cached-body-size 属性控制。默认值为 102400 字节(100 KB)。

  2. ServerHttpRequest.getBody() 方法是否会缓冲整个请求正文?
    不会。ServerHttpRequest.getBody() 方法提供一个 Flux,允许逐块处理请求正文,以避免内存溢出。

  3. 如何在过滤器中访问请求正文的 JSON 结构?
    一旦将请求正文转换为字符串,可以使用 JSON 解析库(例如 Jackson 或 Gson)解析 JSON 结构。

  4. 这些方法适用于哪种版本的 Spring Cloud Gateway?
    这些方法适用于 Spring Cloud Gateway 3.0 及更高版本。

  5. 是否有获取请求正文的更简单方法?
    在 Spring Cloud Gateway 3.1 及更高版本中,可以使用 ServerWebExchangeUtils.getRequestBody(exchange) 方法获取请求正文的 Mono