【跪求解答】如何从Spring Cloud Gateway中的ServerWebExchange中获取原始响应并重写

haoduo777 2018-07-10 10:01:33
各位大佬们,请问下有比较了解spring cloud gateway吗,小弟我想知道怎么从ServerWebExchange中取到接口原始的响应信息,重写后再返回给调用方。实在找不到相关的解决办法,求助了!!!!

我的需求是这样的,获取到接口原始的响应信息,自己再封装一层,形成统一的返回格式,然后再返回给调用方。
...全文
4454 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Microframework 2018-12-19
  • 打赏
  • 举报
回复


public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {



		/**
		 *
		 *
		 * 1.获取请求信息
		 *
		 */
		Route gatewayUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
		URI uri = gatewayUrl.getUri();
		ServerHttpRequest request = (ServerHttpRequest)exchange.getRequest();
		HttpHeaders header = request.getHeaders();
        ServerHttpRequest.Builder mutate = request.mutate();

		String rawPath = request.getURI().toString();
		String path = request.getPath().value();
		String method = request.getMethodValue();
		String token = header.getFirst(JwtUtil.HEADER_AUTH);
		String instance = uri.getAuthority();

		System.out.println("*********************1.请求信息*******************");
		System.out.println("RawPath:" + rawPath);
		System.out.println("path:" + path);
		System.out.println("method:" + method);
		System.out.println("token:" + token);
		System.out.println("instance:" + instance);
		System.out.println("****************************************");






Microframework 2018-12-19
  • 打赏
  • 举报
回复



public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		/**
		 *
		 *
		 * 1.获取请求信息
		 *
		 */
		Route gatewayUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
		URI uri = gatewayUrl.getUri();
		ServerHttpRequest request = (ServerHttpRequest)exchange.getRequest();





天涯泪小武 2018-11-01
  • 打赏
  • 举报
回复
看我注释,那个s就是返回的值

@Component
public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
// -1 is response write filter, must be called before that
return -2;
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (body instanceof Flux) {
Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
return super.writeWith(fluxBody.map(dataBuffer -> {
// probably should reuse buffers
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
//释放掉内存
DataBufferUtils.release(dataBuffer);
String s = new String(content, Charset.forName("UTF-8"));
//TODO,s就是response的值,想修改、查看就随意而为了
byte[] uppedContent = new String(content, Charset.forName("UTF-8")).getBytes();
return bufferFactory.wrap(uppedContent);
}));
}
// if body is not a flux. never got there.
return super.writeWith(body);
}
};
// replace response with decorator
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}
mjunlee 2018-09-18
  • 打赏
  • 举报
回复
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("format", r -> r.path("") .filters(f -> f.filter( // 这个lambda最好定义个filter类new一个filter对象或者注入bean (exchange, chain) -> chain.filter(exchange) .then(Mono.fromRunnable(() -> { // 获取到response 可以对响应体进行重写。 ServerHttpResponse response = exchange.getResponse(); }) ) ) ).uri("") ) .build(); }
haoduo777 2018-07-10
  • 打赏
  • 举报
回复
例如:原始接口返回的响应为:{“code”:200,”data”:”success”} 的字符串

从spring cloud gateway中拿到的响应对象是这个:HttpClientResponse clientResponse = exchange.getAttribute(ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR);

如何从clientResponse中取到原始返回的json字符串

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧