From ea5f0f41562dcf53b8e58ea8deffbe864e7c0659 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 18 Dec 2024 16:09:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E3=80=90=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E3=80=91API=E6=95=B0=E6=8D=AE=E6=BA=90=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/ApiUtils.java | 86 ++++++++++++++---- .../datasource/server/DatasourceServer.java | 3 +- .../datasource/form/ApiHttpRequestForm.vue | 9 +- .../data/datasource/form/EditorDetail.vue | 5 ++ .../data/datasource/form/Pagination.vue | 89 +++++++++++++++---- .../api/ds/vo/ApiDefinitionRequest.java | 26 +++++- 6 files changed, 178 insertions(+), 40 deletions(-) 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 9a6ca85974..4d32c29717 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 @@ -12,10 +12,7 @@ import io.dataease.exception.DEException; import io.dataease.extensions.datasource.dto.DatasetTableDTO; import io.dataease.extensions.datasource.dto.DatasourceRequest; import io.dataease.extensions.datasource.dto.TableField; -import io.dataease.utils.CommonBeanFactory; -import io.dataease.utils.HttpClientConfig; -import io.dataease.utils.HttpClientUtil; -import io.dataease.utils.JsonUtil; +import io.dataease.utils.*; import org.apache.commons.lang3.StringUtils; import org.json.simple.JSONArray; import org.springframework.util.CollectionUtils; @@ -82,12 +79,49 @@ public class ApiUtils { if (apiDefinition == null) { DEException.throwException("未找到"); } - 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); - result.put("dataList", dataList); - return result; + if (apiDefinition.getRequest().getPage() != null && !apiDefinition.getRequest().getPage().getPageType().equalsIgnoreCase("empty")) { + String response = execHttpRequest(false, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); + fieldList = getTableFields(apiDefinition); + result.put("fieldList", fieldList); + if (apiDefinition.getRequest().getPage().getPageType().equalsIgnoreCase("pageNumber")) { + int pageCount = JsonPath.read(response, apiDefinition.getRequest().getPage().getResponseData().get(0).getResolutionPath()); + if (apiDefinition.getRequest().getPage().getResponseData().get(0).getResolutionPathType().equalsIgnoreCase("totalNumber")) { + pageCount = pageCount / Integer.valueOf(apiDefinition.getRequest().getPage().getRequestData().get(1).getParameterDefaultValue()); + } + for (int i = 1; i < pageCount + 1; i++) { + apiDefinition.getRequest().getPage().getRequestData().get(0).setParameterDefaultValue(String.valueOf(i)); + response = execHttpRequest(false, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); + dataList.addAll(fetchResult(response, apiDefinition)); + } + } + if (apiDefinition.getRequest().getPage().getPageType().equalsIgnoreCase("cursor")) { + dataList.addAll(fetchResult(response, apiDefinition)); + String cursor = null; + try { + cursor = JsonPath.read(response, apiDefinition.getRequest().getPage().getResponseData().get(0).getResolutionPath()); + } catch (Exception e) { + } + while (cursor != null) { + apiDefinition.getRequest().getPage().getRequestData().get(0).setParameterDefaultValue(cursor); + response = execHttpRequest(false, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); + dataList.addAll(fetchResult(response, apiDefinition)); + try { + cursor = JsonPath.read(response, apiDefinition.getRequest().getPage().getResponseData().get(0).getResolutionPath()); + } catch (Exception e) { + cursor = null; + } + } + } + result.put("dataList", dataList); + return result; + } else { + String response = execHttpRequest(false, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); + fieldList = getTableFields(apiDefinition); + result.put("fieldList", fieldList); + dataList = fetchResult(response, apiDefinition); + result.put("dataList", dataList); + return result; + } } @@ -142,11 +176,26 @@ public class ApiUtils { if (apiDefinition == null) { DEException.throwException("未找到"); } - String response = execHttpRequest(apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); + String response = execHttpRequest(true, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); return fetchResult(response, apiDefinition); } - public static String execHttpRequest(ApiDefinition apiDefinition, int socketTimeout, List paramsList) { + public static String execHttpRequest(boolean preview, ApiDefinition api, int socketTimeout, List paramsList) { + ApiDefinition apiDefinition = new ApiDefinition(); + BeanUtils.copyBean(apiDefinition, api); + + if (apiDefinition.getRequest().getPage() != null && apiDefinition.getRequest().getPage().getPageType() != null && apiDefinition.getRequest().getPage().getPageType().equalsIgnoreCase("pageNumber")) { + apiDefinition.setUrl(apiDefinition.getUrl().replace(apiDefinition.getRequest().getPage().getRequestData().get(0).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(0).getParameterDefaultValue()).replace(apiDefinition.getRequest().getPage().getRequestData().get(1).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(1).getParameterDefaultValue())); + apiDefinition.setRequest(JsonUtil.parseObject(JsonUtil.toJSONString(apiDefinition.getRequest()).toString().replace(apiDefinition.getRequest().getPage().getRequestData().get(0).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(0).getParameterDefaultValue()).replace(apiDefinition.getRequest().getPage().getRequestData().get(1).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(1).getParameterDefaultValue()), ApiDefinitionRequest.class)); + } + + if (apiDefinition.getRequest().getPage() != null && apiDefinition.getRequest().getPage().getPageType() != null && apiDefinition.getRequest().getPage().getPageType().equalsIgnoreCase("cursor")) { + apiDefinition.setUrl(apiDefinition.getUrl().replace(apiDefinition.getRequest().getPage().getRequestData().get(0).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(0).getParameterDefaultValue()).replace(apiDefinition.getRequest().getPage().getRequestData().get(1).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(1).getParameterDefaultValue())); + String defaultCursor = apiDefinition.getRequest().getPage().getRequestData().get(0).getParameterDefaultValue(); + apiDefinition.setRequest(JsonUtil.parseObject(JsonUtil.toJSONString(apiDefinition.getRequest()).toString().replace(apiDefinition.getRequest().getPage().getRequestData().get(0).getBuiltInParameterName(), StringUtils.isEmpty(defaultCursor) ? "" : defaultCursor).replace(apiDefinition.getRequest().getPage().getRequestData().get(1).getBuiltInParameterName(), apiDefinition.getRequest().getPage().getRequestData().get(1).getParameterDefaultValue()), ApiDefinitionRequest.class)); + } + + String response = ""; HttpClientConfig httpClientConfig = new HttpClientConfig(); httpClientConfig.setSocketTimeout(socketTimeout * 1000); @@ -159,7 +208,7 @@ public class ApiUtils { 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); + String resultStr = execHttpRequest(true, definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { httpClientConfig.addHeader(header.get("name").toString(), dataList.get(0)[i]); @@ -181,7 +230,7 @@ public class ApiUtils { 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); + String resultStr = execHttpRequest(true, definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { result = result.replace("${" + param + "}", dataList.get(0)[i]); @@ -223,7 +272,7 @@ public class ApiUtils { 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); + String resultStr = execHttpRequest(true, definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { params.add(argument.get("name") + "=" + dataList.get(0)[i]); @@ -245,7 +294,7 @@ public class ApiUtils { 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); + String resultStr = execHttpRequest(true, definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { result = result.replace("${" + param + "}", dataList.get(0)[i]); @@ -274,7 +323,6 @@ public class ApiUtils { switch (apiDefinition.getMethod()) { case "GET": - response = HttpClientUtil.get(apiDefinition.getUrl().trim(), httpClientConfig); break; case "POST": @@ -310,7 +358,7 @@ public class ApiUtils { 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); + String resultStr = execHttpRequest(false, definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { body.put(jsonNode.get("name").toString(), dataList.get(0)[i]); @@ -332,7 +380,7 @@ public class ApiUtils { 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); + String resultStr = execHttpRequest(false, definition, definition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), null); List dataList = fetchResult(resultStr, definition); if (dataList.size() > 0) { result = result.replace("${" + param + "}", dataList.get(0)[i]); 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 17ca9d88e0..f873355dd5 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 @@ -876,10 +876,9 @@ 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); 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); + String response = ApiUtils.execHttpRequest(true, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), paramsList); if (request.keySet().contains("type") && request.get("type").equals("apiStructure")) { apiDefinition.setShowApiStructure(true); } diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue index ec6b3f0723..f2b02d7f51 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestForm.vue @@ -10,6 +10,7 @@ import { Body } from './ApiTestModel.js' import type { Item } from './ApiKeyValue.vue' import type { AuthConfig } from './ApiAuthConfig.vue' import type { ApiBodyItem } from './ApiBody.vue' +import { PageSetting } from '@/views/visualized/data/datasource/form/Pagination.vue' export interface ApiRequest { changeId: string headers: Item[] @@ -17,6 +18,7 @@ export interface ApiRequest { arguments: Item[] authManager: AuthConfig body: ApiBodyItem + page: PageSetting } const props = defineProps({ showScript: { @@ -38,6 +40,11 @@ const props = defineProps({ body: { typeChange: '', kvs: [] + }, + page: { + pageType: 'empty', + requestData: [], + responseData: [] } }) }, @@ -193,7 +200,7 @@ const emits = defineEmits(['changeId']) - + diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue index e4273b306b..5eb5873d92 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue @@ -110,6 +110,11 @@ const defaultApiItem = { raw: '', kvs: [] }, + page: { + pageType: 'empty', + requestData: [], + responseData: [] + }, authManager: { verification: '', username: '', diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/Pagination.vue b/core/core-frontend/src/views/visualized/data/datasource/form/Pagination.vue index 7ce03afcd6..cbedc5fdb7 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/Pagination.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/Pagination.vue @@ -1,17 +1,45 @@