SpringCloudgateway如何修改返回数据版本说明
开源软件版本
springboot2.1.6.RELEASE
jdk11.0.3
gradle
主要引⼊了springboot 2.1,lombok
plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
id "io.freefair.lombok" version "3.6.6"
}apply plugin: 'io.spring.dependency-management'group = 'cn.buddie.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'repositories {
mavenCentral()
}ext {
set('springCloudVersion', "Greenwich.SR2")
}dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
compile 'org.projectlombok:lombok:1.18.8'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
yaml
spring:
cloud:
gateway:
enabled: true
routes:
- id: test-route
uri: 127.0.0.1:8123/users
predicates:
- Path=/users
filters:
- UnionResult
filter
yaml中配置的filter名字,加“GatewayFilterFactory”,就是对应的过滤器Java类
package cn.buddie.demo.springcloudgateway.filter;import cn.buddie.del.UnionResult;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.write.ModifyResponseBodyGatewayFilterFactory;
import org.springframework.cloud.gateway.write.RewriteFunction;
import org.springframework.stereotype.Component;
publisher.Mono;/**
* description
*
* @author buddie.wei
* @date 2019/7/20
*/
@Component
public class UnionResultGatewayFilterFactory extends ModifyResponseBodyGatewayFilterFactory {
@Override
public GatewayFilter apply(Config config) {
springcloud和springboot
return new Config());
}
private Config getConfig() {
Config cf = new Config();
// Config.setRewriteFunction(Class<T> inClass, Class<R> outClass, RewriteFunction<T, R> rewriteFunction)
// inClass 原数据类型,可以指定为具体数据类型,我这⾥指定为Object,是为了处理多种数据类型。
// 当然⽀持多接⼝返回多数据类型的统⼀修改,yaml中的配置,path,uri需要做相关调整
// outClass ⽬标数据类型
// rewriteFunction 内容重写⽅法
cf.setRewriteFunction(Object.class, UnionResult.class, getRewriteFunction());
return cf;
} private RewriteFunction<Object, UnionResult> getRewriteFunction() {
return (exchange, resp) -> Mono.just(UnionResult.builder().Request().getHeaders().getFirst("questId")).result(resp).build()); }
}
model
package cn.buddie.del;import lombok.Builder;
import lombok.Getter;
import lombok.Setter;/**
* description
*
* @author buddie.wei
* @date 2019/7/20
*/
@Getter
@Setter
@Builder
public class UnionResult {
private String requestId;
private Object result;
}
SpringCloud gateway修改返回的响应体
问题描述:
在gateway中修改返回的响应体,在全局Filter中添加如下代码:
import Ordered;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
publisher.Mono;@Component
public class RequestGlobalFilter implements GlobalFilter, Ordered {
//...
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
/
/...
ResponseDecorator decorator = new Response());
return chain.filter(exchange.mutate().response(decorator).build());
} @Override
public int getOrder() {
return -1000;
}
}
通过.response(decorator)设置⼀个响应装饰器(⾃定义),以下是装饰器具体实现:
import cn.hutool.json.JSONObject;
activestreams.Publisher;
import io.buffer.DataBuffer;
import io.buffer.DataBufferFactory;
import io.buffer.DataBufferUtils;
import io.buffer.DefaultDataBufferFactory;
import org.springframework.active.ServerHttpResponse;
import org.springframework.active.ServerHttpResponseDecorator;
publisher.Flux;
publisher.Mono;
import java.nio.charset.Charset;/**
* @author visy.wang
* @desc 响应装饰器(重构响应体)
*/
public class ResponseDecorator extends ServerHttpResponseDecorator{
public ResponseDecorator(ServerHttpResponse delegate){
super(delegate);
} @Override
@SuppressWarnings(value = "unchecked")
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { if(body instanceof Flux) {
Flux<DataBuffer> fluxBody = (Flux<DataBuffer>) body; return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffers); byte[] content = new adableByteCount()];
String bodyStr = new String(content, Charset.forName("UTF-8")); //修改响应体
bodyStr = modifyBody(bodyStr); getDelegate().getHeaders().Bytes().length);
return bufferFactory().Bytes());
}));
}
return super.writeWith(body);
} //重写这个函数即可
private String modifyBody(String jsonStr){
JSONObject json = new JSONObject(jsonStr);
//修改响应体
String();
}
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论