From 59d07862fcd4379d7e444d57f02e395f453ba644 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 30 Mar 2022 15:37:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=90=8C=E6=AD=A5API=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E7=9A=84=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider/datasource/ApiProvider.java | 67 +++++++++++++++++-- .../service/datasource/DatasourceService.java | 42 +----------- 2 files changed, 64 insertions(+), 45 deletions(-) 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 56ebf17f63..a0d624995b 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java @@ -62,13 +62,27 @@ public class ApiProvider extends DatasourceProvider{ ApiDefinition apiDefinition = checkApiDefinition(datasourceRequest); String response = execHttpRequest(apiDefinition); - fieldList = getTableFileds(datasourceRequest); + fieldList = getTableFileds(apiDefinition, response); result.put("fieldList", fieldList); dataList = fetchResult(response, apiDefinition); result.put("dataList", dataList); return result; } + + private List getTableFileds(ApiDefinition apiDefinition, String response) throws Exception { + List tableFields = new ArrayList<>(); + for (DatasetTableField field : checkApiDefinition(apiDefinition, response).getFields()) { + TableField tableField = new TableField(); + tableField.setFieldName(field.getOriginName()); + tableField.setRemarks(field.getName()); + tableField.setFieldSize(field.getSize()); + tableField.setFieldType(field.getDeExtractType().toString()); + tableFields.add(tableField); + } + return tableFields; + } + @Override public void handleDatasource(DatasourceRequest datasourceRequest, String type) throws Exception { @@ -83,9 +97,10 @@ public class ApiProvider extends DatasourceProvider{ public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception { List lists = JSONObject.parseArray(datasourceRequest.getDatasource().getConfiguration(), ApiDefinition.class); List tableFields = new ArrayList<>(); - for (ApiDefinition list : lists) { - if(datasourceRequest.getTable().equalsIgnoreCase(list.getName())){ - for (DatasetTableField field : list.getFields()) { + for (ApiDefinition apiDefinition : lists) { + if(datasourceRequest.getTable().equalsIgnoreCase(apiDefinition.getName())){ + String response = ApiProvider.execHttpRequest(apiDefinition); + for (DatasetTableField field : checkApiDefinition(apiDefinition, response).getFields()) { TableField tableField = new TableField(); tableField.setFieldName(field.getOriginName()); tableField.setRemarks(field.getName()); @@ -170,6 +185,50 @@ public class ApiProvider extends DatasourceProvider{ return response; } + static public ApiDefinition checkApiDefinition(ApiDefinition apiDefinition, String response)throws Exception{ + if(StringUtils.isEmpty(response)){ + throw new Exception("该请求返回数据为空"); + } + List datas = new ArrayList<>(); + try { + datas = JsonPath.read(response,apiDefinition.getDataPath()); + }catch (Exception e){ + throw new Exception("jsonPath 路径错误:" + e.getMessage()); + } + + List dataList = new ArrayList<>(); + List fields = new ArrayList<>(); + Set fieldKeys = new HashSet<>(); + //第一遍获取 field + for (LinkedHashMap data : datas) { + Set keys = data.keySet(); + for (String key : keys) { + if(!fieldKeys.contains(key)){ + fieldKeys.add(key); + DatasetTableField tableField = new DatasetTableField(); + tableField.setOriginName(key); + tableField.setName(key); + tableField.setSize(65535); + tableField.setDeExtractType(0); + tableField.setDeType(0); + tableField.setExtField(0); + fields.add(tableField); + } + } + } + //第二遍获取 data + for (LinkedHashMap data : datas) { + JSONObject jsonObject = new JSONObject(); + for (String key : fieldKeys) { + jsonObject.put(key, Optional.ofNullable(data.get(key)).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); + } + dataList.add(jsonObject); + } + apiDefinition.setDatas(dataList); + apiDefinition.setFields(fields); + return apiDefinition; + } + private List fetchResult(String result, ApiDefinition apiDefinition){ List dataList = new LinkedList<>(); List datas = JsonPath.read(result, apiDefinition.getDataPath()); diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index dce4a427fb..2a703a557c 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -366,47 +366,7 @@ public class DatasourceService { public ApiDefinition checkApiDatasource(ApiDefinition apiDefinition) throws Exception { String response = ApiProvider.execHttpRequest(apiDefinition); - if(StringUtils.isEmpty(response)){ - throw new Exception("该请求返回数据为空"); - } - List datas = new ArrayList<>(); - try { - datas = JsonPath.read(response,apiDefinition.getDataPath()); - }catch (Exception e){ - throw new Exception("jsonPath 路径错误:" + e.getMessage()); - } - - List dataList = new ArrayList<>(); - List fields = new ArrayList<>(); - Set fieldKeys = new HashSet<>(); - //第一遍获取 field - for (LinkedHashMap data : datas) { - Set keys = data.keySet(); - for (String key : keys) { - if(!fieldKeys.contains(key)){ - fieldKeys.add(key); - DatasetTableField tableField = new DatasetTableField(); - tableField.setOriginName(key); - tableField.setName(key); - tableField.setSize(65535); - tableField.setDeExtractType(0); - tableField.setDeType(0); - tableField.setExtField(0); - fields.add(tableField); - } - } - } - //第二遍获取 data - for (LinkedHashMap data : datas) { - JSONObject jsonObject = new JSONObject(); - for (String key : fieldKeys) { - jsonObject.put(key, Optional.ofNullable(data.get(key)).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); - } - dataList.add(jsonObject); - } - apiDefinition.setDatas(dataList); - apiDefinition.setFields(fields); - return apiDefinition; + return ApiProvider.checkApiDefinition(apiDefinition, response); } private void checkAndUpdateDatasourceStatus(Datasource datasource){