支持json请求

tanghc 6 years ago
parent faea57beea
commit e200c0f6bd
  1. 54
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/ServerWebExchangeUtil.java
  2. 4
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/LimitFilter.java
  3. 10
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/filter/ValidateFilter.java
  4. 8
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/param/GatewayParamBuilder.java
  5. 14
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/gateway/route/NameVersionRoutePredicateFactory.java

@ -1,16 +1,21 @@
package com.gitee.sop.gatewaycommon.gateway;
import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.alibaba.fastjson.JSON;
import com.gitee.sop.gatewaycommon.bean.SopConstants;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.util.RequestUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import static com.gitee.sop.gatewaycommon.bean.SopConstants.CACHE_REQUEST_BODY_FOR_MAP;
import static com.gitee.sop.gatewaycommon.bean.SopConstants.CACHE_REQUEST_BODY_OBJECT_KEY;
@ -18,12 +23,12 @@ import static com.gitee.sop.gatewaycommon.bean.SopConstants.CACHE_REQUEST_BODY_O
/**
* @author tanghc
*/
public class GatewayContext extends ApiContext {
public class ServerWebExchangeUtil {
/**
* 获取请求参数
* @param exchange
* @return
* @param exchange ServerWebExchange
* @return 返回请求参数
*/
public static ApiParam getApiParam(ServerWebExchange exchange) {
return exchange.getAttribute(SopConstants.CACHE_API_PARAM);
@ -31,8 +36,8 @@ public class GatewayContext extends ApiContext {
/**
* 设置请求参数
* @param exchange
* @param apiParam
* @param exchange ServerWebExchange
* @param apiParam 请求参数
*/
public static void setApiParam(ServerWebExchange exchange, ApiParam apiParam) {
exchange.getAttributes().put(SopConstants.CACHE_API_PARAM, apiParam);
@ -40,12 +45,12 @@ public class GatewayContext extends ApiContext {
/**
* 获取Spring Cloud Gateway请求的原始参数前提是要使用ReadBodyRoutePredicateFactory
* @param exchange
* @param exchange ServerWebExchange
* @return 没有参数返回null
* @see com.gitee.sop.gatewaycommon.gateway.route.ReadBodyRoutePredicateFactory
*/
public static Map<String, String> getRequestParams(ServerWebExchange exchange) {
Map<String, String> params = exchange.getAttribute(CACHE_REQUEST_BODY_FOR_MAP);
public static Map<String, ?> getRequestParams(ServerWebExchange exchange) {
Map<String, ?> params = exchange.getAttribute(CACHE_REQUEST_BODY_FOR_MAP);
if (params != null) {
return params;
}
@ -55,24 +60,49 @@ public class GatewayContext extends ApiContext {
} else {
String cachedBody = exchange.getAttribute(CACHE_REQUEST_BODY_OBJECT_KEY);
if (cachedBody != null) {
MediaType contentType = exchange.getRequest().getHeaders().getContentType();
// 如果是json方式提交
if (contentType != null
&& StringUtils.containsAny(contentType.toString().toLowerCase(), "json", "text")) {
params = JSON.parseObject(cachedBody);
} else {
params = RequestUtil.parseQueryToMap(cachedBody);
}
}
}
if (params != null) {
exchange.getAttributes().put(CACHE_REQUEST_BODY_FOR_MAP, params);
}
return params;
}
private static Map<String, String> buildParams(MultiValueMap<String, String> queryParams) {
public static Map<String, String> buildParams(MultiValueMap<String, String> queryParams) {
if (queryParams == null || queryParams.size() == 0) {
return null;
}
Map<String, String> params = new HashMap<>(queryParams.size());
for (Map.Entry<String, List<String>> entry : queryParams.entrySet()) {
String val = entry.getValue().get(0);
params.put(entry.getKey(), val);
params.put(entry.getKey(), entry.getValue().get(0));
}
return params;
}
/**
* 添加header
* @param exchange 当前ServerWebExchange
* @param headersConsumer headers
* @return 返回一个新的ServerWebExchange
*/
public static ServerWebExchange addHeaders(ServerWebExchange exchange, Consumer<HttpHeaders> headersConsumer) {
// 创建一个新的request
ServerHttpRequest serverHttpRequestNew = exchange.getRequest()
.mutate()
.headers(headersConsumer)
.build();
// 将现在的request 变成 change对象
return exchange
.mutate()
.request(serverHttpRequestNew)
.build();
}
}

@ -3,7 +3,7 @@ package com.gitee.sop.gatewaycommon.gateway.filter;
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import com.gitee.sop.gatewaycommon.bean.ConfigLimitDto;
import com.gitee.sop.gatewaycommon.exception.ApiException;
import com.gitee.sop.gatewaycommon.gateway.GatewayContext;
import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil;
import com.gitee.sop.gatewaycommon.limit.LimitManager;
import com.gitee.sop.gatewaycommon.limit.LimitType;
import com.gitee.sop.gatewaycommon.manager.LimitConfigManager;
@ -34,7 +34,7 @@ public class LimitFilter implements GlobalFilter, Ordered {
if (!apiConfig.isOpenLimit()) {
return chain.filter(exchange);
}
ApiParam apiParam = GatewayContext.getApiParam(exchange);
ApiParam apiParam = ServerWebExchangeUtil.getApiParam(exchange);
ConfigLimitDto configLimitDto = this.findConfigLimitDto(apiConfig, apiParam, exchange);
if (configLimitDto == null) {
return null;

@ -1,9 +1,10 @@
package com.gitee.sop.gatewaycommon.gateway.filter;
import com.gitee.sop.gatewaycommon.exception.ApiException;
import com.gitee.sop.gatewaycommon.gateway.GatewayContext;
import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
import com.gitee.sop.gatewaycommon.param.ParamNames;
import com.gitee.sop.gatewaycommon.validate.Validator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -29,7 +30,7 @@ public class ValidateFilter implements GlobalFilter, Ordered {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 解析参数
ApiParam param = paramBuilder.build(exchange);
GatewayContext.setApiParam(exchange, param);
ServerWebExchangeUtil.setApiParam(exchange, param);
// 验证操作,这里有负责验证签名参数
try {
validator.validate(param);
@ -37,7 +38,10 @@ public class ValidateFilter implements GlobalFilter, Ordered {
log.error("验证失败,params:{}", param.toJSONString(), e);
throw e;
}
return chain.filter(exchange);
ServerWebExchange serverWebExchangeNew = ServerWebExchangeUtil.addHeaders(exchange, httpHeaders -> {
httpHeaders.add(ParamNames.HEADER_VERSION_NAME, param.fetchVersion());
});
return chain.filter(serverWebExchangeNew);
}
@Override

@ -1,6 +1,6 @@
package com.gitee.sop.gatewaycommon.gateway.param;
import com.gitee.sop.gatewaycommon.gateway.GatewayContext;
import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil;
import com.gitee.sop.gatewaycommon.param.BaseParamBuilder;
import org.springframework.web.server.ServerWebExchange;
@ -13,8 +13,8 @@ import java.util.Map;
public class GatewayParamBuilder extends BaseParamBuilder<ServerWebExchange> {
@Override
public Map<String, String> buildRequestParams(ServerWebExchange exchange) {
Map<String, String> params = GatewayContext.getRequestParams(exchange);
public Map<String, ?> buildRequestParams(ServerWebExchange exchange) {
Map<String, ?> params = ServerWebExchangeUtil.getRequestParams(exchange);
return params == null ? Collections.emptyMap() : params;
}
@ -24,6 +24,6 @@ public class GatewayParamBuilder extends BaseParamBuilder<ServerWebExchange> {
}
@Override
public void setVersionInHeader(ServerWebExchange ctx, String headerName, String version) {
public void setVersionInHeader(ServerWebExchange exchange, String headerName, String version) {
}
}

@ -1,7 +1,6 @@
package com.gitee.sop.gatewaycommon.gateway.route;
import com.gitee.sop.gatewaycommon.bean.SopConstants;
import com.gitee.sop.gatewaycommon.gateway.GatewayContext;
import com.gitee.sop.gatewaycommon.gateway.ServerWebExchangeUtil;
import com.gitee.sop.gatewaycommon.param.ParamNames;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
@ -45,14 +44,17 @@ public class NameVersionRoutePredicateFactory extends AbstractRoutePredicateFact
public Predicate<ServerWebExchange> apply(Config config) {
return exchange -> {
Map<String, String> params = GatewayContext.getRequestParams(exchange);
Map<String, ?> params = ServerWebExchangeUtil.getRequestParams(exchange);
if (CollectionUtils.isEmpty(params)) {
return false;
}
String nameVersion = config.param;
String name = params.getOrDefault(ParamNames.API_NAME, SopConstants.UNKNOWN_METHOD);
String version = params.getOrDefault(ParamNames.VERSION_NAME, "");
return (name + version).equals(nameVersion);
Object name = params.get(ParamNames.API_NAME);
Object version = params.get(ParamNames.VERSION_NAME);
if (name == null || version == null) {
return false;
}
return (name.toString() + version.toString()).equals(nameVersion);
};
}

Loading…
Cancel
Save