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 d6317d83cc..8bc6e4f259 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 @@ -41,6 +41,9 @@ public class ApiUtils { }; List apiDefinitionList = JsonUtil.parseList(datasourceRequest.getDatasource().getConfiguration(), listTypeReference); for (ApiDefinition apiDefinition : apiDefinitionList) { + if (StringUtils.isNotEmpty(apiDefinition.getType()) && apiDefinition.getType().equalsIgnoreCase("params")) { + continue; + } DatasetTableDTO datasetTableDTO = new DatasetTableDTO(); datasetTableDTO.setTableName(apiDefinition.getDeTableName()); datasetTableDTO.setName(apiDefinition.getName()); @@ -59,7 +62,7 @@ public class ApiUtils { if (apiDefinition == null) { DEException.throwException("未找到"); } - String response = execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout()); + String response = execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); fieldList = getTableFields(apiDefinition); result.put("fieldList", fieldList); dataList = fetchResult(response, apiDefinition); @@ -116,19 +119,38 @@ public class ApiUtils { if (apiDefinition == null) { DEException.throwException("未找到"); } - String response = execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout()); + String response = execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); return fetchResult(response, apiDefinition); } - public static String execHttpRequest(ApiDefinition apiDefinition, int socketTimeout) { + public static String execHttpRequest(ApiDefinition apiDefinition, int socketTimeout, List paramsList) { String response = ""; HttpClientConfig httpClientConfig = new HttpClientConfig(); httpClientConfig.setSocketTimeout(socketTimeout * 1000); ApiDefinitionRequest apiDefinitionRequest = apiDefinition.getRequest(); for (Map header : apiDefinitionRequest.getHeaders()) { if (header.get("name") != null && StringUtils.isNotEmpty(header.get("name").toString()) && header.get("value") != null && StringUtils.isNotEmpty(header.get("value").toString())) { - httpClientConfig.addHeader(header.get("name").toString(), header.get("value").toString()); + if (header.get("nameType") != null && header.get("nameType").toString().equalsIgnoreCase("params")) { + String param = header.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); + System.out.println(dataList.get(0)[i]); + if (dataList.size() > 0) { + httpClientConfig.addHeader(header.get("name").toString(), dataList.get(0)[i]); + } + } + } + + } + } else { + httpClientConfig.addHeader(header.get("name").toString(), header.get("value").toString()); + } + } } if (apiDefinitionRequest.getAuthManager() != null @@ -194,7 +216,7 @@ public class ApiUtils { return response; } - private static void previewNum(List> field){ + private static void previewNum(List> field) { for (Map stringObjectMap : field) { JSONArray newArray = new JSONArray(); if (stringObjectMap.get("value") != null) { @@ -202,7 +224,7 @@ public class ApiUtils { TypeReference listTypeReference = new TypeReference() { }; JSONArray array = objectMapper.readValue(stringObjectMap.get("value").toString(), listTypeReference); - if(array.size() > 100){ + if (array.size() > 100) { for (int i = 0; i < Math.min(100, array.size()); i++) { newArray.add(array.get(i)); } @@ -254,8 +276,8 @@ public class ApiUtils { } int i = 0; try { - LinkedHashMap data = currentData.get(0); - }catch (Exception e){ + LinkedHashMap data = currentData.get(0); + } catch (Exception e) { DEException.throwException("数据不符合规范, " + e.getMessage()); } for (LinkedHashMap data : currentData) { @@ -540,6 +562,18 @@ public class ApiUtils { } + private static List params(DatasourceRequest datasourceRequest) { + TypeReference> listTypeReference = new TypeReference>() { + }; + List apiDefinitionListTemp = null; + try { + apiDefinitionListTemp = objectMapper.readValue(datasourceRequest.getDatasource().getConfiguration(), listTypeReference); + } catch (Exception e) { + DEException.throwException(e); + } + return apiDefinitionListTemp.stream().filter(apiDefinition -> apiDefinition.getType() != null && apiDefinition.getType().equalsIgnoreCase("params")).collect(Collectors.toList()); + } + private static ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws DEException { List apiDefinitionList = new ArrayList<>(); TypeReference> listTypeReference = new TypeReference>() { diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index bbc252b61e..33697e9c02 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -107,6 +107,8 @@ public class DatasourceServer implements DatasourceApi { all_scope, add_scope } + private TypeReference> listTypeReference = new TypeReference>() { + }; @Resource private CommonThreadPool commonThreadPool; @@ -505,11 +507,11 @@ public class DatasourceServer implements DatasourceApi { DEException.throwException("不存在的数据源!"); } BeanUtils.copyBean(datasourceDTO, datasource); - TypeReference> listTypeReference = new TypeReference>() { - }; + if (datasourceDTO.getType().equalsIgnoreCase(DatasourceConfiguration.DatasourceType.API.toString())) { List apiDefinitionList = JsonUtil.parseList(datasourceDTO.getConfiguration(), listTypeReference); List apiDefinitionListWithStatus = new ArrayList<>(); + List params = new ArrayList<>(); int success = 0; for (ApiDefinition apiDefinition : apiDefinitionList) { String status = null; @@ -534,9 +536,16 @@ public class DatasourceServer implements DatasourceApi { if (log != null) { apiDefinition.setUpdateTime(log.getStartTime()); } - apiDefinitionListWithStatus.add(apiDefinition); + + + if (StringUtils.isEmpty(apiDefinition.getType()) || apiDefinition.getType().equalsIgnoreCase("table")) { + apiDefinitionListWithStatus.add(apiDefinition); + } else { + params.add(apiDefinition); + } } datasourceDTO.setApiConfigurationStr(new String(Base64.getEncoder().encode(Objects.requireNonNull(JsonUtil.toJSONString(apiDefinitionListWithStatus)).toString().getBytes()))); + datasourceDTO.setParamsStr(new String(Base64.getEncoder().encode(Objects.requireNonNull(JsonUtil.toJSONString(params)).toString().getBytes()))); if (success == apiDefinitionList.size()) { datasourceDTO.setStatus("Success"); } else { @@ -847,12 +856,13 @@ public class DatasourceServer implements DatasourceApi { } public ApiDefinition checkApiDatasource(Map request) throws DEException { + ApiDefinition apiDefinition = JsonUtil.parseObject(new String(java.util.Base64.getDecoder().decode(request.get("data"))), ApiDefinition.class); - String response = ApiUtils.execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout()); + List paramsList = JsonUtil.parseList(new String(java.util.Base64.getDecoder().decode(request.get("paramsList"))), listTypeReference); + String response = ApiUtils.execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), paramsList); if (request.keySet().contains("type") && request.get("type").equals("apiStructure")) { apiDefinition.setShowApiStructure(true); } - ApiUtils.checkApiDefinition(apiDefinition, response); if (apiDefinition.getRequest().getAuthManager() != null && StringUtils.isNotBlank(apiDefinition.getRequest().getAuthManager().getUsername()) && StringUtils.isNotBlank(apiDefinition.getRequest().getAuthManager().getPassword()) && apiDefinition.getRequest().getAuthManager().getVerification().equals("Basic Auth")) { apiDefinition.getRequest().getAuthManager().setUsername(new String(Base64.getEncoder().encode(apiDefinition.getRequest().getAuthManager().getUsername().getBytes()))); diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue index 80c1bfec5a..0575cf124f 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue @@ -24,6 +24,7 @@ export interface Field { export interface ApiItem { status: string name: string + type: string deTableName?: string url: string method: string @@ -57,10 +58,12 @@ const originFieldItem = reactive({ }) let apiItemList = reactive([]) +let paramsList = reactive([]) let apiItem = reactive({ status: '', name: '', + type: 'table', url: '', method: 'GET', request: { @@ -95,6 +98,7 @@ const edit_api_item = ref(false) const active = ref(1) const loading = ref(false) const columns = shallowRef([]) +const valueList = shallowRef([]) const tableData = shallowRef([]) const apiItemBasicInfo = ref() const isNumber = (rule, value, callback) => { @@ -152,9 +156,16 @@ const rule = reactive({ }) const activeName = ref('third') provide('api-active-name', activeName) -const initApiItem = (val: ApiItem, apiList, name) => { +const initApiItem = (val: ApiItem, from, name) => { activeName.value = name - apiItemList = apiList + apiItemList = from.apiConfiguration + paramsList = from.paramsConfiguration + if (val.type !== 'params') { + valueList.value = [] + for (let i = 0; i < paramsList.length; i++) { + valueList.value = valueList.value.concat(paramsList[i].fields) + } + } Object.assign(apiItem, val) edit_api_item.value = true active.value = 0 @@ -167,9 +178,10 @@ const showApiData = () => { apiItemBasicInfo.value.validate(valid => { if (valid) { const data = Base64.encode(JSON.stringify(apiItem)) + const params = Base64.encode(JSON.stringify(paramsList)) loading.value = true cancelMap['/datasource/checkApiDatasource']?.() - checkApiItem({ data: data, type: 'apiStructure' }) + checkApiItem({ data: data, type: 'apiStructure', paramsList: params }) .then(response => { originFieldItem.jsonFields = response.data.jsonFields }) @@ -203,7 +215,7 @@ const fieldOptions = [ ] const disabledNext = ref(false) const saveItem = () => { - if (apiItem.fields.length === 0) { + if (apiItem.type !== 'params' && apiItem.fields.length === 0) { ElMessage.error(t('datasource.api_field_not_empty')) return } @@ -239,7 +251,8 @@ const next = () => { } cancelMap['/datasource/checkApiDatasource']?.() - checkApiItem({ data: Base64.encode(JSON.stringify(apiItem)) }) + const params = Base64.encode(JSON.stringify(paramsList)) + checkApiItem({ data: Base64.encode(JSON.stringify(apiItem)), paramsList: params }) .then(response => { apiItem.jsonFields = response.data.jsonFields apiItem.fields = [] @@ -465,6 +478,7 @@ defineExpose({ @@ -572,7 +586,11 @@ defineExpose({ - +