post exchange.getAttributes().put() 怎么用
时间: 2023-11-27 07:52:46 浏览: 238
`exchange.getAttributes().put()` 是一个用于向 HTTP 请求或响应添加属性的方法。在使用这个方法之前,需要先了解 Exchange 对象的概念。在 Spring Webflux 中,Exchange 表示一个 HTTP 请求和对应的响应。Exchange 对象包含了请求和响应的所有信息,比如请求 URL、请求头、请求体、响应状态码等等。
`exchange.getAttributes().put()` 方法用于向 Exchange 对象中添加属性。可以将任何对象作为属性值,并用字符串作为属性名进行索引。以下是一个示例:
```
exchange.getAttributes().put("myAttribute", myObject);
```
这里我们向 Exchange 对象中添加了一个名为 "myAttribute" 的属性,属性值为 myObject 对象。添加属性后,我们可以通过相应的 getter 方法来获取这个属性:
```
MyObject myObject = exchange.getAttributes().get("myAttribute");
```
这里我们使用 `get()` 方法来获取名为 "myAttribute" 的属性值,并将其转换为 MyObject 类型。如果 Exchange 对象中不存在名为 "myAttribute" 的属性,则 `get()` 方法将返回 null。
相关问题
post exchange.getAttributes().put() 怎么添加body
`exchange.getAttributes().put()` 是用来设置HTTP请求的属性,而HTTP请求的body需要通过`exchange.getRequest().getBody()`来获取并设置。下面是一个示例代码,展示如何将字符串作为请求体发送到服务器:
```java
String requestBody = "Hello World!";
exchange.getRequest().setBody(requestBody.getBytes());
```
在这个示例中,我们将字符串"Hello World!"作为请求体,首先将其转换为字节数组,然后通过`exchange.getRequest().setBody()`设置到HTTP请求中。你也可以根据需要自行修改请求体的内容和格式。
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)); } };
这段代码是一个 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 表示请求满足条件。
阅读全文