forked from github/dataease
fix: API 数据集校验错误
This commit is contained in:
parent
fb446e3943
commit
7879eed3ff
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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<DatasetTableField> fields;
|
||||
private String request;
|
||||
private ApiDefinitionRequest request;
|
||||
private String dataPath;
|
||||
private String status;
|
||||
private List<JsonObject> datas = new ArrayList<>();
|
||||
private List<Map<String,String>> datas = new ArrayList<>();
|
||||
}
|
||||
|
@ -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<JsonObject> headers = new ArrayList<>();
|
||||
private JsonObject body = new JsonObject();
|
||||
private List<Map<String, String>> headers = new ArrayList<>();
|
||||
private Map<String, Object> body = new HashMap<>();
|
||||
private AuthManager authManager = new AuthManager();
|
||||
|
||||
|
||||
|
@ -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<ApiDefinition> apiConfiguration;
|
||||
private String typeDesc;
|
||||
private DatasourceCalculationMode calculationMode;
|
||||
}
|
||||
|
@ -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<String, String> 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<JsonObject> dataList = new ArrayList<>();
|
||||
List<Map<String,String>> dataList = new ArrayList<>();
|
||||
List<DatasetTableField> fields = new ArrayList<>();
|
||||
Set<String> fieldKeys = new HashSet<>();
|
||||
//第一遍获取 field
|
||||
@ -213,11 +209,11 @@ public class ApiProvider extends Provider {
|
||||
}
|
||||
//第二遍获取 data
|
||||
for (LinkedHashMap data : datas) {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
Map<String,String> 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<ApiDefinition> apiDefinitionList = new ArrayList<>();
|
||||
List<ApiDefinition> apiDefinitionListTemp = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), new TypeToken<List<ApiDefinition>>() {
|
||||
}.getType());
|
||||
if (CollectionUtils.isEmpty(apiDefinitionListTemp)) {
|
||||
List<ApiDefinition> apiDefinitionListTemp = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), new TypeToken<List<ApiDefinition>>() {}.getType());
|
||||
if (CollectionUtils.isNotEmpty(apiDefinitionListTemp)) {
|
||||
for (ApiDefinition apiDefinition : apiDefinitionListTemp) {
|
||||
if (apiDefinition.getName().equalsIgnoreCase(datasourceRequest.getTable())) {
|
||||
apiDefinitionList.add(apiDefinition);
|
||||
|
@ -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<ApiDefinition> apiDefinitionList = new Gson().fromJson(datasourceDTO.getConfiguration(), new TypeToken<ArrayList<ApiDefinition>>() {}.getType());
|
||||
List<ApiDefinition> 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<ApiDefinition> apiDefinitionList = new Gson().fromJson(datasource.getConfiguration(), new TypeToken<List<ApiDefinition>>() {}.getType());
|
||||
List<ApiDefinition> 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());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user