diff --git a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java index b00980d258..9b810e15e8 100644 --- a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java +++ b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java @@ -23,5 +23,7 @@ public class ApiDefinition { private int previewNum = 10; private int maxPreviewNum = 10; private int serialNumber; + private boolean useJsonPath; + private String jsonPath; } diff --git a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java index 5d7218e6d4..3b5d621fd4 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java @@ -125,7 +125,6 @@ public class ApiProvider extends Provider { } static public String execHttpRequest(ApiDefinition apiDefinition, int socketTimeout) throws Exception { - String response = ""; HttpClientConfig httpClientConfig = new HttpClientConfig(); httpClientConfig.setSocketTimeout(socketTimeout * 1000); @@ -135,7 +134,6 @@ public class ApiProvider extends Provider { httpClientConfig.addHeader(header.get("name").toString(), header.get("value").toString()); } } - if (apiDefinitionRequest.getAuthManager() != null && StringUtils.isNotBlank(apiDefinitionRequest.getAuthManager().getUsername()) && StringUtils.isNotBlank(apiDefinitionRequest.getAuthManager().getPassword()) @@ -188,27 +186,72 @@ public class ApiProvider extends Provider { throw new Exception("该请求返回数据为空"); } List fields = new ArrayList<>(); - String rootPath; - if (response.startsWith("[")) { - rootPath = "$[*]"; - JSONArray jsonArray = JSONObject.parseArray(response); - for (Object o : jsonArray) { - handleStr(apiDefinition, o.toString(), fields, rootPath); + if (apiDefinition.isUseJsonPath()) { + List currentData = new ArrayList<>(); + Object object = JsonPath.read(response, apiDefinition.getJsonPath()); + if (object instanceof List) { + currentData = (List) object; + } else { + currentData.add((LinkedHashMap) object); } + for (LinkedHashMap data : currentData) { + int i = 0; + if (i >= apiDefinition.getPreviewNum()) { + break; + } + if (i == 0) { + for (Object o : data.keySet()) { + JSONObject field = new JSONObject(); + field.put("originName", o.toString()); + field.put("name", o.toString()); + field.put("type", "STRING"); + field.put("checked", true); + field.put("size", 65535); + field.put("deExtractType", 0); + field.put("deType", 0); + field.put("extField", 0); + fields.add(field); + } + } + for (JSONObject field : fields) { + JSONArray array = field.getJSONArray("value"); + if (array != null) { + array.add(Optional.ofNullable(data.get(field.getString("originName"))).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); + } else { + array = new JSONArray(); + array.add(Optional.ofNullable(data.get(field.getString("originName"))).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); + } + field.put("value", array); + i++; + } + } + + apiDefinition.setJsonFields(fields); + return apiDefinition; } else { - rootPath = "$"; - handleStr(apiDefinition, response, fields, rootPath); - } - for (JSONObject field : fields) { - if (field.containsKey("children") && CollectionUtils.isNotEmpty(field.getJSONArray("children"))) { - field.put("disabled", false); + + String rootPath; + if (response.startsWith("[")) { + rootPath = "$[*]"; + JSONArray jsonArray = JSONObject.parseArray(response); + for (Object o : jsonArray) { + handleStr(apiDefinition, o.toString(), fields, rootPath); + } + } else { + rootPath = "$"; + handleStr(apiDefinition, response, fields, rootPath); } - if (field.containsKey("children") && CollectionUtils.isEmpty(field.getJSONArray("children"))) { - field.put("disabled", true); + for (JSONObject field : fields) { + if (field.containsKey("children") && CollectionUtils.isNotEmpty(field.getJSONArray("children"))) { + field.put("disabled", false); + } + if (field.containsKey("children") && CollectionUtils.isEmpty(field.getJSONArray("children"))) { + field.put("disabled", true); + } } + apiDefinition.setJsonFields(fields); + return apiDefinition; } - apiDefinition.setJsonFields(fields); - return apiDefinition; } @@ -362,7 +405,7 @@ public class ApiProvider extends Provider { private List fetchResult(String result, ApiDefinition apiDefinition) { List dataList = new LinkedList<>(); - if (StringUtils.isNotEmpty(apiDefinition.getDataPath()) && CollectionUtils.isEmpty(apiDefinition.getJsonFields())) { + if(apiDefinition.isUseJsonPath()){ List currentData = new ArrayList<>(); Object object = JsonPath.read(result, apiDefinition.getDataPath()); if (object instanceof List) { @@ -379,30 +422,49 @@ public class ApiProvider extends Provider { } dataList.add(row); } - } else { - List jsonPaths = apiDefinition.getFields().stream().map(DatasetTableFieldDTO::getJsonPath).collect(Collectors.toList()); - Long maxLength = 0l; - List> columnDataList = new ArrayList<>(); - for (int i = 0; i < jsonPaths.size(); i++) { - List data = new ArrayList<>(); - Object object = JsonPath.read(result, jsonPaths.get(i)); - if (object instanceof List && jsonPaths.get(i).contains("[*]")) { - data = (List) object; + }else { + if (StringUtils.isNotEmpty(apiDefinition.getDataPath()) && CollectionUtils.isEmpty(apiDefinition.getJsonFields())) { + List currentData = new ArrayList<>(); + Object object = JsonPath.read(result, apiDefinition.getDataPath()); + if (object instanceof List) { + currentData = (List) object; } else { - if (object != null) { - data.add(object.toString()); - } + currentData.add((LinkedHashMap) object); } - maxLength = maxLength > data.size() ? maxLength : data.size(); - columnDataList.add(data); - } - for (int i = 0; i < maxLength; i++) { - String[] row = new String[apiDefinition.getFields().size()]; - dataList.add(row); - } - for (int i = 0; i < columnDataList.size(); i++) { - for (int j = 0; j < columnDataList.get(i).size(); j++) { - dataList.get(j)[i] = Optional.ofNullable(String.valueOf(columnDataList.get(i).get(j))).orElse("").replaceAll("\n", " ").replaceAll("\r", " "); + for (LinkedHashMap data : currentData) { + String[] row = new String[apiDefinition.getFields().size()]; + int i = 0; + for (DatasetTableFieldDTO field : apiDefinition.getFields()) { + row[i] = Optional.ofNullable(data.get(field.getOriginName())).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " "); + i++; + } + dataList.add(row); + } + } else { + List jsonPaths = apiDefinition.getFields().stream().map(DatasetTableFieldDTO::getJsonPath).collect(Collectors.toList()); + Long maxLength = 0l; + List> columnDataList = new ArrayList<>(); + for (int i = 0; i < jsonPaths.size(); i++) { + List data = new ArrayList<>(); + Object object = JsonPath.read(result, jsonPaths.get(i)); + if (object instanceof List && jsonPaths.get(i).contains("[*]")) { + data = (List) object; + } else { + if (object != null) { + data.add(object.toString()); + } + } + maxLength = maxLength > data.size() ? maxLength : data.size(); + columnDataList.add(data); + } + for (int i = 0; i < maxLength; i++) { + String[] row = new String[apiDefinition.getFields().size()]; + dataList.add(row); + } + for (int i = 0; i < columnDataList.size(); i++) { + for (int j = 0; j < columnDataList.get(i).size(); j++) { + dataList.get(j)[i] = Optional.ofNullable(String.valueOf(columnDataList.get(i).get(j))).orElse("").replaceAll("\n", " ").replaceAll("\r", " "); + } } } } diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index d91485d152..99fccc8b24 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -2431,7 +2431,7 @@ public class DataSetTableService { int num = 1; String line; while ((line = reader.readLine()) != null) { - if (num > 100) { + if (num > 1000) { break; } data.add(Arrays.asList(line.split(","))); diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index e2c2470700..f357ddb5a9 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1894,7 +1894,9 @@ export default { base_info: 'Basic information', column_info: 'Data structure', request: 'Request', + isUseJsonPath: 'Specify JsonPath or not', path_all_info: 'Please fill in the full address', + jsonpath_info: 'Please fill in JsonPath', req_param: 'Request parameters', headers: 'Request header', key: 'Key', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 127682131e..59629fd327 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1888,7 +1888,9 @@ export default { base_info: '基礎信息', column_info: '資料結構', request: '請求', + isUseJsonPath: '是否指定JsonPath', path_all_info: '請輸入完整地址', + jsonpath_info: '請輸入JsonPath', req_param: '請求參數', headers: '請求頭', key: '鍵', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 91eb158574..51385df793 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1887,7 +1887,9 @@ export default { base_info: '基础信息', column_info: '数据结构', request: '请求', + isUseJsonPath: '是否指定JsonPath', path_all_info: '请填入完整地址', + jsonpath_info: '请填入JsonPath', req_param: '请求参数', headers: '请求头', key: '键', diff --git a/frontend/src/views/system/datasource/DsConfiguration.vue b/frontend/src/views/system/datasource/DsConfiguration.vue index 1b70e2a517..e6f899599b 100644 --- a/frontend/src/views/system/datasource/DsConfiguration.vue +++ b/frontend/src/views/system/datasource/DsConfiguration.vue @@ -535,6 +535,32 @@ /> + + + + + + + + @@ -567,7 +593,7 @@ {{ scope.row.originName }} @@ -973,12 +999,18 @@ export default { originName: 'comments', deExtractType: 0 } - ] + ], + useJsonPath: false, + jsonPath: '' }, reqOptions: [ { id: 'GET', label: 'GET' }, { id: 'POST', label: 'POST' } ], + isUseJsonPath: [ + { id: true, label: this.$t('commons.yes') }, + { id: false, label: this.$t('commons.no') } + ], loading: false, responseData: { type: 'HTTP', responseResult: {}, subRequestResults: [] }, api_step2_active_name: 'first', diff --git a/frontend/src/views/system/datasource/DsFormContent.vue b/frontend/src/views/system/datasource/DsFormContent.vue index cfff528d0e..7af186cf52 100644 --- a/frontend/src/views/system/datasource/DsFormContent.vue +++ b/frontend/src/views/system/datasource/DsFormContent.vue @@ -1018,6 +1018,7 @@ export default { delete item.status }) form.configuration = Base64.encode(JSON.stringify(form.apiConfiguration)) + form.apiConfiguration = [] } else { form.configuration = Base64.encode(JSON.stringify(form.configuration)) } @@ -1156,6 +1157,7 @@ export default { const data = JSON.parse(JSON.stringify(this.form)) if (data.type === 'api') { data.configuration = Base64.encode(JSON.stringify(data.apiConfiguration)) + data.apiConfiguration = [] } else { data.configuration = Base64.encode(JSON.stringify(data.configuration)) }