diff --git a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java index c8de6b1d16..f39c51ebc3 100644 --- a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java +++ b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java @@ -61,7 +61,7 @@ public class DatasourceController { @ApiIgnore @PostMapping("/validate") - public ResultHolder validate(@RequestBody DatasourceDTO datasource) throws Exception { + public ResultHolder validate(@RequestBody Datasource datasource) throws Exception { return datasourceService.validate(datasource); } 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 5fb024cbab..7885b80684 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 @@ -6,6 +6,7 @@ import lombok.Data; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Data public class ApiDefinition { @@ -14,8 +15,8 @@ public class ApiDefinition { private String url; private String method = "GET"; private List fields; - private String request; + private ApiDefinitionRequest request; private String dataPath; private String status; - private List datas = new ArrayList<>(); + private List> datas = new ArrayList<>(); } diff --git a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java index 59dc793ff9..ef07542903 100644 --- a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java @@ -3,12 +3,14 @@ package io.dataease.controller.request.datasource; import com.google.gson.JsonObject; import lombok.Data; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Data public class ApiDefinitionRequest { - private List headers = new ArrayList<>(); - private JsonObject body = new JsonObject(); + private List> headers = new ArrayList<>(); + private Map body = new HashMap<>(); private AuthManager authManager = new AuthManager(); diff --git a/backend/src/main/java/io/dataease/dto/DatasourceDTO.java b/backend/src/main/java/io/dataease/dto/DatasourceDTO.java index 81a76a54c6..47d39bd4cf 100644 --- a/backend/src/main/java/io/dataease/dto/DatasourceDTO.java +++ b/backend/src/main/java/io/dataease/dto/DatasourceDTO.java @@ -1,11 +1,13 @@ package io.dataease.dto; -import com.google.gson.JsonArray; +import io.dataease.controller.request.datasource.ApiDefinition; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.constants.DatasourceCalculationMode; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * Author: wangjiahao * Date: 2021-05-18 @@ -16,7 +18,7 @@ public class DatasourceDTO extends Datasource { @ApiModelProperty("权限") private String privileges; - private JsonArray apiConfiguration; + private List apiConfiguration; private String typeDesc; private DatasourceCalculationMode calculationMode; } 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 a46ef243f4..d588d617d8 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java @@ -1,8 +1,6 @@ package io.dataease.provider.datasource; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; +import com.google.gson.*; import com.google.gson.reflect.TypeToken; import io.dataease.plugins.common.dto.datasource.TableDesc; import io.dataease.plugins.common.dto.datasource.TableField; @@ -22,7 +20,6 @@ import org.springframework.stereotype.Service; import java.util.*; -import java.util.stream.Collectors; @Service("apiProvider") public class ApiProvider extends Provider { @@ -122,11 +119,10 @@ public class ApiProvider extends Provider { static public String execHttpRequest(ApiDefinition apiDefinition) throws Exception { String response = ""; HttpClientConfig httpClientConfig = new HttpClientConfig(); - ApiDefinitionRequest apiDefinitionRequest = new Gson().fromJson(apiDefinition.getRequest(), ApiDefinitionRequest.class); - //headers - for (JsonObject header : apiDefinitionRequest.getHeaders()) { - if (header.get("name") != null && StringUtils.isNotEmpty(header.get("name").getAsString()) && header.get("value") != null && StringUtils.isNotEmpty(header.get("value").getAsString())) { - httpClientConfig.addHeader(header.get("name").getAsString(), header.get("value").getAsString()); + 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()); } } @@ -147,18 +143,18 @@ public class ApiProvider extends Provider { if (apiDefinitionRequest.getBody().get("type") == null) { throw new Exception("请求类型不能为空"); } - String type = apiDefinitionRequest.getBody().get("type").getAsString(); + String type = apiDefinitionRequest.getBody().get("type").toString(); if (StringUtils.equalsAny(type, "JSON", "XML", "Raw")) { String raw = null; if (apiDefinitionRequest.getBody().get("raw") != null) { - raw = apiDefinitionRequest.getBody().get("raw").getAsString(); + raw = apiDefinitionRequest.getBody().get("raw").toString(); response = HttpClientUtil.post(apiDefinition.getUrl(), raw, httpClientConfig); } } if (StringUtils.equalsAny(type, "Form_Data", "WWW_FORM")) { if (apiDefinitionRequest.getBody().get("kvs") != null) { Map body = new HashMap<>(); - JsonArray kvsArr = apiDefinitionRequest.getBody().getAsJsonArray("kvs"); + JsonArray kvsArr = JsonParser.parseString(apiDefinitionRequest.getBody().get("kvs").toString()).getAsJsonArray(); for (int i = 0; i < kvsArr.size(); i++) { JsonObject kv = kvsArr.get(i).getAsJsonObject(); if (kv.get("name") != null) { @@ -191,7 +187,7 @@ public class ApiProvider extends Provider { throw new Exception("jsonPath 路径错误:" + e.getMessage()); } - List dataList = new ArrayList<>(); + List> dataList = new ArrayList<>(); List fields = new ArrayList<>(); Set fieldKeys = new HashSet<>(); //第一遍获取 field @@ -213,11 +209,11 @@ public class ApiProvider extends Provider { } //第二遍获取 data for (LinkedHashMap data : datas) { - JsonObject jsonObject = new JsonObject(); + Map mapData = new HashMap<>(); for (String key : fieldKeys) { - jsonObject.addProperty(key, Optional.ofNullable(data.get(key)).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); + mapData.put(key, Optional.ofNullable(data.get(key)).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); } - dataList.add(jsonObject); + dataList.add(mapData); } apiDefinition.setDatas(dataList); apiDefinition.setFields(fields); @@ -248,9 +244,8 @@ public class ApiProvider extends Provider { private ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws Exception { List apiDefinitionList = new ArrayList<>(); - List apiDefinitionListTemp = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), new TypeToken>() { - }.getType()); - if (CollectionUtils.isEmpty(apiDefinitionListTemp)) { + List apiDefinitionListTemp = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), new TypeToken>() {}.getType()); + if (CollectionUtils.isNotEmpty(apiDefinitionListTemp)) { for (ApiDefinition apiDefinition : apiDefinitionListTemp) { if (apiDefinition.getName().equalsIgnoreCase(datasourceRequest.getTable())) { apiDefinitionList.add(apiDefinition); 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 e1562c49ae..7fc5e98756 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -7,6 +7,7 @@ import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.dataease.auth.annotation.DeCleaner; import io.dataease.commons.constants.RedisConstants; +import io.dataease.commons.utils.BeanUtils; import io.dataease.ext.ExtDataSourceMapper; import io.dataease.ext.query.GridExample; import io.dataease.commons.constants.DePermissionType; @@ -144,16 +145,15 @@ public class DatasourceService { datasourceDTO.setConfiguration(datasourceDTO.getConfiguration()); } if (datasourceDTO.getType().equalsIgnoreCase(DatasourceTypes.api.toString())) { - JsonArray apiDefinitionList = JsonParser.parseString(datasourceDTO.getConfiguration()).getAsJsonArray(); - JsonArray apiDefinitionListWithStatus = new JsonArray(); + List apiDefinitionList = new Gson().fromJson(datasourceDTO.getConfiguration(), new TypeToken>() {}.getType()); + List apiDefinitionListWithStatus = new ArrayList<>(); int success = 0; if (StringUtils.isNotEmpty(datasourceDTO.getStatus())) { JsonObject apiItemStatuses = JsonParser.parseString(datasourceDTO.getStatus()).getAsJsonObject(); - for (Object apiDefinition : apiDefinitionList) { - String status = apiItemStatuses.get(JsonParser.parseString(apiDefinition.toString()).getAsJsonObject().get("name").getAsString()).getAsString(); - JsonObject object = JsonParser.parseString(apiDefinition.toString()).getAsJsonObject(); - object.addProperty("status", status); - apiDefinitionListWithStatus.add(object); + for (ApiDefinition apiDefinition : apiDefinitionList) { + String status = apiItemStatuses.get(apiDefinition.getName()).getAsString(); + apiDefinition.setStatus(status); + apiDefinitionListWithStatus.add(apiDefinition); if (StringUtils.isNotEmpty(status) && status.equalsIgnoreCase("Success")) { success++; } @@ -232,40 +232,41 @@ public class DatasourceService { } } - public ResultHolder validate(DatasourceDTO datasource) throws Exception { + public ResultHolder validate(Datasource datasource) throws Exception { + DatasourceDTO datasourceDTO = new DatasourceDTO(); + BeanUtils.copyBean(datasourceDTO, datasource); try { Provider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(datasource); String datasourceStatus = datasourceProvider.checkStatus(datasourceRequest); if (datasource.getType().equalsIgnoreCase("api")) { - Gson gson = new Gson(); int success = 0; - JsonArray apiDefinitionList = JsonParser.parseString(datasource.getConfiguration()).getAsJsonArray(); - JsonArray apiDefinitionListWithStatus = new JsonArray(); + List apiDefinitionList = new Gson().fromJson(datasource.getConfiguration(), new TypeToken>() {}.getType()); + List apiDefinitionListWithStatus = new ArrayList<>(); + if (StringUtils.isNotEmpty(datasourceStatus)) { JsonObject apiItemStatuses = JsonParser.parseString(datasourceStatus).getAsJsonObject(); - for (Object apiDefinition : apiDefinitionList) { - String status = apiItemStatuses.get(JsonParser.parseString(apiDefinition.toString()).getAsJsonObject().get("name").getAsString()).getAsString(); - JsonObject object = JsonParser.parseString(apiDefinition.toString()).getAsJsonObject(); - object.addProperty("status", status); - apiDefinitionListWithStatus.add(object); + for (ApiDefinition apiDefinition : apiDefinitionList) { + String status = apiItemStatuses.get(apiDefinition.getName()).getAsString(); + apiDefinition.setStatus(status); + apiDefinitionListWithStatus.add(apiDefinition); if (StringUtils.isNotEmpty(status) && status.equalsIgnoreCase("Success")) { success++; } } } - datasource.setApiConfiguration(apiDefinitionListWithStatus); + datasourceDTO.setApiConfiguration(apiDefinitionListWithStatus); if (success == apiDefinitionList.size()) { - return ResultHolder.success(datasource); + return ResultHolder.success(datasourceDTO); } if (success > 0 && success < apiDefinitionList.size()) { - return ResultHolder.error("Datasource has invalid tables", datasource); + return ResultHolder.error("Datasource has invalid tables", datasourceDTO); } - return ResultHolder.error("Datasource is invalid.", datasource); + return ResultHolder.error("Datasource is invalid.", datasourceDTO); } - return ResultHolder.success(datasource); + return ResultHolder.success(datasourceDTO); } catch (Exception e) { return ResultHolder.error("Datasource is invalid: " + e.getMessage()); }