CacheRequestBody GatewayFilter 工厂

某些情况下需要读取请求体。由于请求只能读取一次,我们需要缓存请求体。您可以使用 CacheRequestBody 过滤器在将其发送到下游之前缓存请求体,并通过 exchange 属性获取请求体。

以下清单展示了如何使用 CacheRequestBody 网关过滤器来缓存请求体

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("cache_request_body_route", r -> r.path("/downstream/**")
            .filters(f -> f.prefixPath("/httpbin")
        		.cacheRequestBody(String.class).uri(uri))
        .build();
}
application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: cache_request_body_route
        uri: lb://downstream
        predicates:
        - Path=/downstream/**
        filters:
        - name: CacheRequestBody
          args:
            bodyClass: java.lang.String

CacheRequestBody 提取请求体并将其转换为指定的 body 类(例如 java.lang.String,如前面的示例所示)。然后,CacheRequestBody 将其放置在通过 ServerWebExchange.getAttributes() 可用的属性中,其键由 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR 定义。

此过滤器仅适用于 HTTP(包括 HTTPS)请求。