From e71be5f9c8e96078cf6920a4f82de69d42f92aa7 Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 19 Apr 2021 11:52:55 +0800 Subject: [PATCH] support XML input in gateway aggregation #115 --- .../main/java/we/filter/AggregateFilter.java | 4 +- .../src/main/java/we/fizz/ConfigLoader.java | 2 + fizz-core/src/main/java/we/fizz/Pipeline.java | 39 +++++++++++++++++-- .../java/we/fizz/input/ClientInputConfig.java | 39 +++++++++++++++---- 4 files changed, 71 insertions(+), 13 deletions(-) diff --git a/fizz-core/src/main/java/we/filter/AggregateFilter.java b/fizz-core/src/main/java/we/filter/AggregateFilter.java index 116b082..af07fdc 100644 --- a/fizz-core/src/main/java/we/filter/AggregateFilter.java +++ b/fizz-core/src/main/java/we/filter/AggregateFilter.java @@ -135,14 +135,14 @@ public class AggregateFilter implements WebFilter { clientInput.put("method", method); clientInput.put("headers", headers); clientInput.put("params", MapUtil.toHashMap(request.getQueryParams())); - + clientInput.put("contentType", request.getHeaders().getFirst(CommonConstants.HEADER_CONTENT_TYPE)); Mono result = null; if (HttpMethod.POST.name().equalsIgnoreCase(method)) { result = DataBufferUtils.join(request.getBody()).defaultIfEmpty(emptyBody).flatMap(buf -> { if(buf != null && buf != emptyBody) { try { - clientInput.put("body", JSON.parse(buf.toString(StandardCharsets.UTF_8))); + clientInput.put("body", buf.toString(StandardCharsets.UTF_8)); } finally { DataBufferUtils.release(buf); } diff --git a/fizz-core/src/main/java/we/fizz/ConfigLoader.java b/fizz-core/src/main/java/we/fizz/ConfigLoader.java index 99c8625..b7f87d5 100644 --- a/fizz-core/src/main/java/we/fizz/ConfigLoader.java +++ b/fizz-core/src/main/java/we/fizz/ConfigLoader.java @@ -135,6 +135,8 @@ public class ConfigLoader { clientInputConfig.setParamsDef(cfgNode.select("$.paramsDef").toObject(Map.class)); clientInputConfig.setScriptValidate(cfgNode.select("$.scriptValidate").toObject(Map.class)); clientInputConfig.setValidateResponse(cfgNode.select("$.validateResponse").toObject(Map.class)); + clientInputConfig.setContentType(cfgNode.select("$.contentType").getString()); + clientInputConfig.setXmlArrPaths(cfgNode.select("$.xmlArrPaths").getString()); input.setConfig(clientInputConfig); return input; } diff --git a/fizz-core/src/main/java/we/fizz/Pipeline.java b/fizz-core/src/main/java/we/fizz/Pipeline.java index 2acec35..569581b 100644 --- a/fizz-core/src/main/java/we/fizz/Pipeline.java +++ b/fizz-core/src/main/java/we/fizz/Pipeline.java @@ -50,6 +50,8 @@ import we.util.JacksonUtils; import we.util.JsonSchemaUtils; import we.util.MapUtil; import we.xml.JsonToXml; +import we.xml.XmlToJson; +import we.xml.XmlToJson.Builder; /** * @@ -78,7 +80,7 @@ public class Pipeline { public Mono run(Input input, Map clientInput, String traceId) { ClientInputConfig config = (ClientInputConfig)input.getConfig(); - this.initialStepContext(clientInput); + this.initialStepContext(clientInput, config); this.stepContext.setDebug(config.isDebug()); this.stepContext.setApplicationContext(applicationContext); @@ -141,7 +143,7 @@ public class Pipeline { return Mono.just(aggResult); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public Mono createStep(Step step) { long start = System.currentTimeMillis(); List monos = step.run(); @@ -168,7 +170,7 @@ public class Pipeline { * 初始化上下文 * @param clientInput 客户端提交上来的信息 */ - public void initialStepContext(Map clientInput) { + public void initialStepContext(Map clientInput, ClientInputConfig config) { Map input = new HashMap<>(); Map inputRequest = new HashMap<>(); Map inputResponse = new HashMap<>(); @@ -179,12 +181,41 @@ public class Pipeline { inputRequest.put("method", clientInput.get("method")); inputRequest.put("headers", clientInput.get("headers")); inputRequest.put("params", clientInput.get("params")); - inputRequest.put("body", clientInput.get("body")); + + if (CONTENT_TYPE_XML.equals(config.getContentType()) || (StringUtils.isEmpty(config.getContentType()) + && isXmlContentType((String) clientInput.get("contentType")))) { + String[] paths = null; + if (!StringUtils.isEmpty(config.getXmlArrPaths())) { + paths = config.getXmlArrPaths().split(","); + } + Builder builder = new XmlToJson.Builder((String) clientInput.get("body")); + if (paths != null && paths.length > 0) { + for (int j = 0; j < paths.length; j++) { + String p = paths[j]; + builder = builder.forceList(p); + } + } + inputRequest.put("body", builder.build().toJson().toMap()); + } else { + inputRequest.put("body", JSON.parse((String) clientInput.get("body"))); + } } stepContext.put("input", input); } + private boolean isXmlContentType(String contentType) { + if (contentType != null) { + String[] cts = contentType.split(";"); + for (int i = 0; i < cts.length; i++) { + if (CONTENT_TYPE_XML.equals(cts[i])) { + return true; + } + } + } + return false; + } + @SuppressWarnings("unchecked") private StepResponse doStepDataMapping(Step step) { StepResponse stepResponse = (StepResponse)stepContext.get(step.getName()); if (step.getDataMapping() != null) { diff --git a/fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java b/fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java index 61fff67..9a47ed8 100644 --- a/fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java +++ b/fizz-core/src/main/java/we/fizz/input/ClientInputConfig.java @@ -38,8 +38,10 @@ public class ClientInputConfig extends InputConfig { private Map paramsDef; private Map scriptValidate; private Map validateResponse; + private String contentType; + private String xmlArrPaths; - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public ClientInputConfig(Map configBody) { super(configBody); if(configBody.get("debug") != null) { @@ -56,22 +58,28 @@ public class ClientInputConfig extends InputConfig { } if (configBody.get("langDef") != null) { - langDef = ((Map) configBody.get("langDef")); + langDef = (Map) configBody.get("langDef"); } if (configBody.get("bodyDef") != null) { - bodyDef = ((Map) configBody.get("bodyDef")); + bodyDef = (Map) configBody.get("bodyDef"); } if (configBody.get("paramsDef") != null) { - paramsDef = ((Map) configBody.get("paramsDef")); + paramsDef = (Map) configBody.get("paramsDef"); } if (configBody.get("headersDef") != null) { - headersDef = ((Map) configBody.get("headersDef")); + headersDef = (Map) configBody.get("headersDef"); } if (configBody.get("scriptValidate") != null) { - scriptValidate = ((Map) configBody.get("scriptValidate")); + scriptValidate = (Map) configBody.get("scriptValidate"); } if (configBody.get("validateResponse") != null) { - validateResponse = ((Map) configBody.get("validateResponse")); + validateResponse = (Map) configBody.get("validateResponse"); + } + if (configBody.get("contentType") != null) { + contentType = (String) configBody.get("contentType"); + } + if (configBody.get("xmlArrPaths") != null) { + xmlArrPaths = (String) configBody.get("xmlArrPaths"); } } @@ -159,4 +167,21 @@ public class ClientInputConfig extends InputConfig { public void setValidateResponse(Map validateResponse) { this.validateResponse = validateResponse; } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + public String getXmlArrPaths() { + return xmlArrPaths; + } + + public void setXmlArrPaths(String xmlArrPaths) { + this.xmlArrPaths = xmlArrPaths; + } + }