ServerWebExchange获取body参数为null问题

1.新增过滤器,对参数进行缓存
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Component
public class CacheBodyGlobalFilter implements Ordered, GlobalFilter {
public static final String CACHE_REQUEST_BODY_OBJECT_KEY = “cachedRequestBodyObject”;
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
if (exchange.getRequest().getHeaders().getContentType() == null) {
return chain.filter(exchange);
} else {
return DataBufferUtils.join(exchange.getRequest().getBody())
.flatMap(dataBuffer -> {
DataBufferUtils.retain(dataBuffer);
Flux cachedFlux = Flux
.defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
exchange.getRequest()) {
@Override
public Flux getBody() {
return cachedFlux;
}
};
exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, cachedFlux);
return chain.filter(exchange.mutate().request(mutatedRequest).build());
});
}
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
2.获取缓存数据
private String getExchangeCache(ServerWebExchange exchange) {
Flux body = exchange.getAttribute(“cachedRequestBodyObject”);
AtomicReference bodyString = new AtomicReference<>(“”);
body.subscribe(buffer -> {
byte[] bytes = new byte[buffer.readableByteCount()];
buffer.read(bytes);
DataBufferUtils.release(buffer);
try {
bodyString.set(new String(bytes, “utf-8”));
} catch (Exception e) {
e.printStackTrace();
}
});
return bodyString.get();
}
3.参数转换,请求格式Content-Type:application/x-www-form-urlencoded
public JSONObject getJsonStrByQueryUrl(String paramStr){
String[] params = paramStr.split(“&”);
JSONObject obj = new JSONObject();
for (int i = 0; i < params.length; i++) {
String[] param = params[i].split(“=”);
if (param.length >= 2) {
String key = param[0];
String value = param[1];
for (int j = 2; j < param.length; j++) {
value += “=” + param[j];
}
try {
obj.put(key,value);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
return obj;
}
原文章:原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要获取HTTP请求的body,可以使用以下步骤: 1. 从HTTP请求中获取请求体的长度(Content-Length)。 2. 读取请求体的内容。 3. 将请求体的内容转换为字符串或其他格式。 在使用ServerWebExchange获取HTTP请求的body时,可以使用以下代码: ```java public Mono<Void> handle(ServerWebExchange exchange) { return exchange.getRequest().getBody() .map(dataBuffer -> { byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); DataBufferUtils.release(dataBuffer); return bytes; }) .map(bytes -> { String body = new String(bytes, StandardCharsets.UTF_8); // 处理请求体 return body; }) .then(); } ``` 这段代码中,我们使用`exchange.getRequest().getBody()`方法获取请求体的`Flux<DataBuffer>`,然后使用`map`操作符将`DataBuffer`转换为字节数组,再将字节数组转换为字符串。最后,我们可以在`map`操作符中处理请求体的内容。 ### 回答2: ServerWebExchange是Spring WebFlux框架中的接口,用于处理HTTP请求和响应。它包含了一个请求对象和一个响应对象,用于处理HTTP请求和响应的操作。 在处理HTTP请求和响应时,我们经常需要获取请求的body,也就是HTTP请求中的数据。ServerWebExchange提供了几种方法来获取body,具体如下: 1. 通过getBody()方法获取body ServerWebExchange提供了getBody()方法来获取请求的body,该方法的返回值类型为Mono<DataBuffer>,表示请求的body是一个数据缓冲区,可以通过它来获取请求的内容。具体的代码可以如下: ``` Mono<DataBuffer> bodyMono = serverWebExchange.getRequest().getBody(); ``` 2. 通过readWith()方法获取body 除了使用getBody()方法获取请求的body外,ServerWebExchange还提供了readWith()方法,可以直接从DataBuffer中读取请求的内容,不需要通过Mono来获取。具体的代码可以如下: ``` Flux<DataBuffer> bodyFlux = serverWebExchange.getRequest().getBody(); BodyExtractors.toDataBuffers().apply(bodyFlux).map(DataBufferUtils::release).subscribe(); ``` 这种方法可以直接读取数据缓冲区中的内容,但需要注意的是,在读取数据缓冲区时需要确保已经全部读取完毕,否则可能会导致数据读取不完整。 3. 通过注解获取body 最后一种方法是通过注解来获取body,具体是通过@RequestBody注解来获取请求的body。使用这种方法需要在Controller类中添加该注解,并且需要使用Mono或者Flux来接收请求的body。具体代码如下: ``` @PostMapping("/user") public Mono<User> saveUser(@RequestBody Mono<User> userMono) { return userMono.map(userRepository::save); } ``` 以上就是ServerWebExchange获取body的几种方式,不同的方法有不同的特点,你可以根据不同的需求选择合适的方法。 ### 回答3: serverwebexchange是Spring框架中用于获取HTTP请求和响应信息的接口。要获取HTTP请求中的body部分,可以通过serverwebexchange接口中提供的方法实现。 首先,要获取HTTP请求信息,可以使用serverwebexchange.getRequest()方法。这个方法返回一个ServerHttpRequest对象,代表了HTTP请求信息。其中,getBody()方法可以用来获取HTTP请求中的body部分。这个方法的返回值类型为Flux<DataBuffer>,代表了一段二进制数据流。 接下来,我们需要将Flux<DataBuffer>类型的body转换为字符串类型。可以使用FluxUtil.toDataBuffer()方法将二进制数据流转换为DataBuffer对象,再通过DataBuffer对象中的asString()方法将其转换为字符串类型。具体实现代码如下: ``` ServerHttpRequest request = serverWebExchange.getRequest(); Flux<DataBuffer> body = request.getBody(); String bodyString = DataBufferUtils.join(body).flatMap(buffer -> { byte[] bytes = new byte[buffer.readableByteCount()]; buffer.read(bytes); DataBufferUtils.release(buffer); return Mono.just(new String(bytes, StandardCharsets.UTF_8)); }).block(); ``` 以上代码分为三部分。首先获取HTTP请求信息并获取body部分;然后使用DataBufferUtils.join()方法将Flux<DataBuffer>类型的body转换为DataBuffer对象;最后使用flatMap()方法将DataBuffer对象转换为字符串类型。 需要注意的是,上述代码要放在一个合适的位置,以保证在接收到HTTP请求时能够正确获取body。最好是将其封装为一个工具类,方便在代码中调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值