public class RequestBodyRoutePredicateFactory extends AbstractRoutePredicateFactory<RequestBodyRoutePredicateFactory.Config> { protected static final Log LOGGER = LogFactory.getLog(RequestBodyRoutePredicateFactory.class); private final List<HttpMessageReader<?>> messageReaders; public RequestBodyRoutePredicateFactory() { super(RequestBodyRoutePredicateFactory.Config.class); this.messageReaders = HandlerStrategies.withDefaults().messageReaders(); } public RequestBodyRoutePredicateFactory(List<HttpMessageReader<?>> messageReaders) { super(RequestBodyRoutePredicateFactory.Config.class); this.messageReaders = messageReaders; } public static final String REQUEST_BODY_ATTR = "requestBodyAttr"; @Override public AsyncPredicate<ServerWebExchange> applyAsync(Config config) { return exchange -> { if (!"POST".equals(exchange.getRequest().getMethodValue())&&!"PUT".equals(exchange.getRequest().getMethodValue())) { return Mono.just(true); } Object cachedBody = exchange.getAttribute(REQUEST_BODY_ATTR); if (cachedBody != null) { try { return Mono.just(true); } catch (ClassCastException e) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Predicate test failed because class in predicate does not match the cached body object", e); } } return Mono.just(true); } else { return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> ServerRequest.create(exchange.mutate().request(serverHttpRequest).build(), this.messageReaders).bodyToMono(String.class).defaultIfEmpty("").doOnNext((objectValue) -> { if(StringUtils.isBlank(objectValue)){ exchange.getAttributes().put(REQUEST_BODY_ATTR, JSON.toJSONString(exchange.getRequest().getQueryParams())); }else { exchange.getAttributes().put(REQUEST_BODY_ATTR, objectValue); } }).map((objectValue) -> true)); } };
时间: 2024-02-14 13:32:56 浏览: 223
这段代码是一个 Spring Cloud Gateway 的请求体谓词工厂类,用于判断请求的 HTTP 方法是否为 POST 或 PUT,并处理请求的 body 数据。具体可以分为以下几个部分:
1. 继承了 Spring Cloud Gateway 的 AbstractRoutePredicateFactory 抽象类,并实现了 Config 配置类。
2. 在构造函数中初始化了默认的 HttpMessageReader 集合,用于读取请求体中的数据。
3. applyAsync 方法是该类的核心方法,通过异步的方式判断是否满足条件。
4. 判断 HTTP 方法是否为 POST 或 PUT,如果不是则直接返回 true。
5. 如果请求体已经被缓存,则直接返回 true。
6. 如果请求体还没有被缓存,则通过 ServerWebExchangeUtils.cacheRequestBodyAndRequest 方法缓存请求体,并将其转化为 String 类型。
7. 判断请求体是否为空,如果为空,则将请求参数转化为 JSON 字符串并缓存到 REQUEST_BODY_ATTR 中。
8. 如果请求体不为空,则将其缓存到 REQUEST_BODY_ATTR 中。
9. 最后返回 true 表示请求满足条件。
阅读全文