From 1abddd7874613b04dbb0b12d4a1df4f95fdf7298 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 8 Aug 2024 16:54:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=20API=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=97=B6=E9=97=B4=E5=8F=82=E6=95=B0=20#8378?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/ApiUtils.java | 61 +++++++++++++- .../datasource/form/ApiHttpRequestForm.vue | 1 + .../data/datasource/form/ApiKeyValue.vue | 33 +++++++- .../data/datasource/form/ApiVariable.vue | 84 ++++++++++++++++++- 4 files changed, 174 insertions(+), 5 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java index c713b31199..03430dc13f 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java @@ -22,6 +22,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import java.net.URLEncoder; +import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -178,13 +179,21 @@ public class ApiUtils { String resultStr = execHttpRequest(definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { - result = result.replace("${" + param +"}",dataList.get(0)[i]); + result = result.replace("${" + param + "}", dataList.get(0)[i]); } } } } } httpClientConfig.addHeader(header.get("name").toString(), result); + } else if (header.get("nameType") != null && header.get("nameType").toString().equalsIgnoreCase("timeFun")) { + String timeFormat = header.get("value").toString(); + Calendar calendar = Calendar.getInstance(); + Date date = calendar.getTime(); + if (StringUtils.isNotEmpty(timeFormat) && timeFormat.split(" ")[0].equalsIgnoreCase("currentDay")) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(timeFormat.split(" ")[1]); + httpClientConfig.addHeader(header.get("name").toString(), simpleDateFormat.format(date)); + } } else { httpClientConfig.addHeader(header.get("name").toString(), header.get("value").toString()); } @@ -203,7 +212,55 @@ public class ApiUtils { List params = new ArrayList<>(); for (Map argument : apiDefinition.getRequest().getArguments()) { if (StringUtils.isNotEmpty(argument.get("name")) && StringUtils.isNotEmpty(argument.get("value"))) { - params.add(argument.get("name") + "=" + URLEncoder.encode(argument.get("value"))); + if (argument.get("nameType") != null && argument.get("nameType").toString().equalsIgnoreCase("params")) { + String param = argument.get("value").toString(); + for (ApiDefinition definition : paramsList) { + for (int i = 0; i < definition.getFields().size(); i++) { + TableField field = definition.getFields().get(i); + if (field.getOriginName().equalsIgnoreCase(param)) { + String resultStr = execHttpRequest(definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); + List dataList = fetchResult(resultStr, definition); + if (dataList.size() > 0) { + params.add(argument.get("name") + "=" + dataList.get(0)[i]); + } + } + } + } + } else if (argument.get("nameType") != null && argument.get("nameType").toString().equalsIgnoreCase("custom")) { + List arrayList = new ArrayList<>(); + String regex = "\\$\\{(.*?)\\}"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(argument.get("value").toString()); + while (matcher.find()) { + arrayList.add(matcher.group(1)); + } + String result = argument.get("value").toString(); + for (String param : arrayList) { + for (ApiDefinition definition : paramsList) { + for (int i = 0; i < definition.getFields().size(); i++) { + TableField field = definition.getFields().get(i); + if (field.getOriginName().equalsIgnoreCase(param)) { + String resultStr = execHttpRequest(definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); + List dataList = fetchResult(resultStr, definition); + if (dataList.size() > 0) { + result = result.replace("${" + param + "}", dataList.get(0)[i]); + } + } + } + } + } + params.add(argument.get("name") + "=" + result); + } else if (argument.get("nameType") != null && argument.get("nameType").toString().equalsIgnoreCase("timeFun")) { + String timeFormat = argument.get("value").toString(); + Calendar calendar = Calendar.getInstance(); + Date date = calendar.getTime(); + if (StringUtils.isNotEmpty(timeFormat) && timeFormat.split(" ")[0].equalsIgnoreCase("currentDay")) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(timeFormat.split(" ")[1]); + params.add(argument.get("name") + "=" + simpleDateFormat.format(date)); + } + } else { + params.add(argument.get("name") + "=" + URLEncoder.encode(argument.get("value"))); + } } } if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(params)) { diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue index 525520ff0d..f38beb1726 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue @@ -157,6 +157,7 @@ const emits = defineEmits(['changeId']) :is-read-only="isReadOnly" :isShowEnable="isShowEnable" :parameters="apiRequest.arguments" + :value-list="valueList" /> diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/ApiKeyValue.vue b/core/core-frontend/src/views/visualized/data/datasource/form/ApiKeyValue.vue index 7590b4f43d..00e9c79f8a 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/ApiKeyValue.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/ApiKeyValue.vue @@ -86,11 +86,26 @@ const options = [ label: '固定值', value: 'fixed' }, + { + label: '时间函数', + value: 'timeFun' + }, { label: '自定义', value: 'custom' } ] + +const timeFunLists = [ + { + label: '当天(yyyy-MM-DD)', + value: 'currentDay yyyy-MM-DD' + }, + { + label: '当天(yyyy/MM/DD)', + value: 'currentDay yyyy/MM/DD' + } +]