springCloud gateway 替换请求体
@Component
public class MyFilter implements GlobalFilter {
private final DataBufferFactory dataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
@Autowired
private ObjectMapper objectMapper;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("123456");
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(request) {
@Override
public Flux<DataBuffer> getBody() {
Flux<DataBuffer> body = super.getBody();
InputStreamHolder holder = new InputStreamHolder();
body.subscribe(buffer -> {
holder.inputStream = buffer.asInputStream();
});
if (null != holder.inputStream) {
try {
JsonNode jsonNode = objectMapper.readTree(holder.inputStream);
Assert.isTrue(jsonNode instanceof ObjectNode, "JSON格式异常");
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("name", "网关过滤器添加");
DataBuffer dataBuffer = dataBufferFactory.allocateBuffer();
String json = objectNode.toString();
System.out.println("最终的JSON数据为:{}"+ json);
dataBuffer.write(json.getBytes(StandardCharsets.UTF_8));
return Flux.just(dataBuffer);
} catch (Exception e) {
throw new IllegalStateException(e);
}
} else {
return super.getBody();
}
}
};
return chain.filter(exchange.mutate().request(decorator).build());
}
}