各位大佬们,请问下有比较了解spring cloud gateway吗,小弟我想知道怎么从ServerWebExchange中取到接口原始的响应信息,重写后再返回给调用方。实在找不到相关的解决办法,求助了!!!!我的需求是这样的,获取到接口原始的响应信息,自己再封装一层,形成统一的返回格式,然后再返回给调用方。

解决方案 »

  1.   

    例如:原始接口返回的响应为:{“code”:200,”data”:”success”} 的字符串从spring cloud gateway中拿到的响应对象是这个:HttpClientResponse clientResponse = exchange.getAttribute(ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR);如何从clientResponse中取到原始返回的json字符串
      

  2.   

    @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();
      }
      

  3.   

    看我注释,那个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());
        }
    }
      

  4.   


    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();
      

  5.   

    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("****************************************");