From a0439bf844c6575eedcf5582d1645df311d1c1c8 Mon Sep 17 00:00:00 2001 From: song-tianyang Date: Sat, 2 Apr 2022 23:18:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D8000=E8=A1=8CJSON=E4=BD=9C=E4=B8=BA=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E6=8E=A5=E5=8F=A3=E4=BD=BF=E7=94=A8=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=97=A0=E6=B3=95=E5=8A=A0=E8=BD=BD=E7=9A=84=E7=BC=BA?= =?UTF-8?q?=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复8000行JSON作为参数的接口使用文档无法加载的缺陷 --- .../api/dto/share/ApiDocumentInfoDTO.java | 2 +- .../api/service/ShareInfoService.java | 107 ++++++++---------- .../components/document/ApiDocumentAnchor.vue | 3 + .../document/components/ApiRequestInfo.vue | 6 +- 4 files changed, 53 insertions(+), 65 deletions(-) diff --git a/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java index bd3f1203b0..83563403b8 100644 --- a/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/share/ApiDocumentInfoDTO.java @@ -31,7 +31,7 @@ public class ApiDocumentInfoDTO { private String requestBodyFormData; private String requestBodyStrutureData; private Object requestPreviewData; - private Object jsonSchemaBody; + private String jsonSchemaBody; private String responseHead; private String responseBody; diff --git a/backend/src/main/java/io/metersphere/api/service/ShareInfoService.java b/backend/src/main/java/io/metersphere/api/service/ShareInfoService.java index 15ddd20929..6f868d425e 100644 --- a/backend/src/main/java/io/metersphere/api/service/ShareInfoService.java +++ b/backend/src/main/java/io/metersphere/api/service/ShareInfoService.java @@ -3,6 +3,7 @@ package io.metersphere.api.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import io.metersphere.api.dto.automation.APIScenarioReportResult; import io.metersphere.api.dto.share.*; import io.metersphere.base.domain.*; @@ -110,7 +111,7 @@ public class ShareInfoService { return true; } - public ApiDocumentInfoDTO conversionModelToDTO(ApiDefinitionWithBLOBs apiModel, Map userIdMap) { + public ApiDocumentInfoDTO conversionModelToDTO(ApiDefinitionWithBLOBs apiModel, Map userIdMap) { ApiDocumentInfoDTO apiInfoDTO = new ApiDocumentInfoDTO(); JSONArray previewJsonArray = new JSONArray(); if (apiModel != null) { @@ -120,19 +121,19 @@ public class ShareInfoService { apiInfoDTO.setUri(apiModel.getPath()); apiInfoDTO.setStatus(apiModel.getStatus()); - if(StringUtils.isNotEmpty(apiModel.getTags())){ + if (StringUtils.isNotEmpty(apiModel.getTags())) { JSONArray tagsArr = JSONArray.parseArray(apiModel.getTags()); List tagList = new ArrayList<>(); - for(int i = 0;i < tagsArr.size();i ++){ + for (int i = 0; i < tagsArr.size(); i++) { tagList.add(tagsArr.getString(i)); } - if(!tagList.isEmpty()){ - apiInfoDTO.setTags(StringUtils.join(tagList,",")); + if (!tagList.isEmpty()) { + apiInfoDTO.setTags(StringUtils.join(tagList, ",")); } } - apiInfoDTO.setResponsibler(userIdMap.get(apiModel.getUserId()) == null? apiModel.getUserId() : userIdMap.get(apiModel.getUserId()).getName()); - apiInfoDTO.setCreateUser(userIdMap.get(apiModel.getCreateUser()) == null? apiModel.getCreateUser() : userIdMap.get(apiModel.getCreateUser()).getName()); + apiInfoDTO.setResponsibler(userIdMap.get(apiModel.getUserId()) == null ? apiModel.getUserId() : userIdMap.get(apiModel.getUserId()).getName()); + apiInfoDTO.setCreateUser(userIdMap.get(apiModel.getCreateUser()) == null ? apiModel.getCreateUser() : userIdMap.get(apiModel.getCreateUser()).getName()); apiInfoDTO.setDesc(apiModel.getDescription()); ApiModuleService apiModuleService = CommonBeanFactory.getBean(ApiModuleService.class); apiInfoDTO.setModules(apiModuleService.getModuleNameById(apiModel.getModuleId())); @@ -165,6 +166,7 @@ public class ShareInfoService { } } } catch (Exception e) { + LogUtil.error(e.getMessage()); } } //rest参数设置 @@ -180,6 +182,7 @@ public class ShareInfoService { } } } catch (Exception e) { + LogUtil.error(e.getMessage()); } } apiInfoDTO.setUrlParams(urlParamArr.toJSONString()); @@ -207,20 +210,12 @@ public class ShareInfoService { isJsonSchema = true; } } - if (isJsonSchema) { - apiInfoDTO.setRequestBodyParamType("JSON-SCHEMA"); - apiInfoDTO.setJsonSchemaBody(bodyObj); - if (bodyObj.containsKey("jsonSchema")) { - JSONObject jsonSchemaObj = bodyObj.getJSONObject("jsonSchema"); - apiInfoDTO.setRequestPreviewData(JSON.parse(JSONSchemaGenerator.getJson(jsonSchemaObj.toJSONString()))); - } - } else { - if (bodyObj.containsKey("raw")) { - String raw = bodyObj.getString("raw"); - apiInfoDTO.setRequestBodyStrutureData(raw); - //转化jsonObje 或者 jsonArray - this.setPreviewData(previewJsonArray, raw); - } + if (bodyObj.containsKey("raw")) { + String raw = bodyObj.getString("raw"); + apiInfoDTO.setJsonSchemaBody(raw); + apiInfoDTO.setRequestBodyStrutureData(raw); + //转化jsonObje 或者 jsonArray + this.setPreviewData(previewJsonArray, raw); } } else if (StringUtils.equalsAny(type, "XML", "Raw")) { if (bodyObj.containsKey("raw")) { @@ -281,9 +276,8 @@ public class ShareInfoService { } } } catch (Exception e) { - + LogUtil.error(e.getMessage()); } - } } } @@ -303,7 +297,7 @@ public class ShareInfoService { } apiInfoDTO.setResponseHead(responseHeadDataArr.toJSONString()); } catch (Exception e) { - + LogUtil.error(e.getMessage()); } } // 赋值响应体 @@ -330,10 +324,8 @@ public class ShareInfoService { } } if (isJsonSchema) { -// apiInfoDTO.setRequestBodyParamType("JSON-SCHEMA"); apiInfoDTO.setResponseBodyParamType("JSON-SCHEMA"); apiInfoDTO.setJsonSchemaResponseBody(bodyObj); -// apiInfoDTO.setJsonSchemaBody(bodyObj); } else { if (bodyObj.containsKey("raw")) { String raw = bodyObj.getString("raw"); @@ -342,10 +334,6 @@ public class ShareInfoService { this.setPreviewData(previewJsonArray, raw); } } -// if (bodyObj.containsKey("raw")) { -// String raw = bodyObj.getString("raw"); -// apiInfoDTO.setResponseBodyStrutureData(raw); -// } } else if (StringUtils.equalsAny(type, "Form Data", "WWW_FORM")) { if (bodyObj.containsKey("kvs")) { JSONArray bodyParamArr = new JSONArray(); @@ -386,7 +374,7 @@ public class ShareInfoService { } } } catch (Exception e) { - + LogUtil.error(e.getMessage()); } } @@ -403,7 +391,7 @@ public class ShareInfoService { } apiInfoDTO.setResponseCode(responseStatusDataArr.toJSONString()); } catch (Exception e) { - + LogUtil.error(e.getMessage()); } } } @@ -418,21 +406,24 @@ public class ShareInfoService { private JSONObject genJSONObject(String request) { JSONObject returnObj = null; try { - returnObj = JSONObject.parseObject(request); + returnObj = JSONObject.parseObject(request, Feature.DisableCircularReferenceDetect); } catch (Exception e) { + LogUtil.error(e.getMessage()); } return returnObj; } private void setPreviewData(JSONArray previewArray, String data) { try { - JSONObject previewObj = JSONObject.parseObject(data); + JSONObject previewObj = JSONObject.parseObject(data, Feature.DisableCircularReferenceDetect); previewArray.add(previewObj); } catch (Exception e) { + LogUtil.error(e.getMessage()); } try { previewArray = JSONArray.parseArray(data); } catch (Exception e) { + LogUtil.error(e.getMessage()); } } @@ -554,44 +545,42 @@ public class ShareInfoService { @Transactional(propagation = Propagation.NOT_SUPPORTED) public void validateExpired(ShareInfo shareInfo) { // 有效期根据类型从ProjectApplication中获取 - if(shareInfo == null ){ + if (shareInfo == null) { MSException.throwException(Translator.get("connection_expired")); } String type = ""; - String projectId=""; - if(shareInfo.getShareType().equals("PERFORMANCE_REPORT")){ + String projectId = ""; + if (shareInfo.getShareType().equals("PERFORMANCE_REPORT")) { type = ProjectApplicationType.PERFORMANCE_SHARE_REPORT_TIME.toString(); LoadTestReportWithBLOBs loadTestReportWithBLOBs = loadTestReportMapper.selectByPrimaryKey(shareInfo.getCustomData()); - if(loadTestReportWithBLOBs!=null){ + if (loadTestReportWithBLOBs != null) { projectId = loadTestReportWithBLOBs.getProjectId(); } } - if(shareInfo.getShareType().equals("PLAN_DB_REPORT")){ + if (shareInfo.getShareType().equals("PLAN_DB_REPORT")) { type = ProjectApplicationType.TRACK_SHARE_REPORT_TIME.toString(); TestPlanWithBLOBs testPlan = getTestPlan(shareInfo); - if (testPlan != null){ + if (testPlan != null) { projectId = testPlan.getProjectId(); - }; - + } } - if(shareInfo.getShareType().equals("API_REPORT")){ + if (shareInfo.getShareType().equals("API_REPORT")) { type = ProjectApplicationType.API_SHARE_REPORT_TIME.toString(); APIScenarioReportResult reportResult = extApiScenarioReportMapper.get(shareInfo.getCustomData()); - if (reportResult != null){ + if (reportResult != null) { projectId = reportResult.getProjectId(); - }; - + } } - if(StringUtils.isBlank(type)|| Strings.isBlank(projectId)){ - millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime() ,1000 * 60 * 60 * 24,shareInfo.getId()); - }else{ - ProjectApplication projectApplication = projectApplicationService.getProjectApplication(projectId,type); - if(projectApplication.getTypeValue()==null){ - millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime() ,1000 * 60 * 60 * 24,shareInfo.getId()); - }else { - String expr= projectApplication.getTypeValue(); - long timeMills = getTimeMills(shareInfo.getUpdateTime(),expr); - millisCheck(System.currentTimeMillis(),timeMills,shareInfo.getId()); + if (StringUtils.isBlank(type) || Strings.isBlank(projectId)) { + millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId()); + } else { + ProjectApplication projectApplication = projectApplicationService.getProjectApplication(projectId, type); + if (projectApplication.getTypeValue() == null) { + millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId()); + } else { + String expr = projectApplication.getTypeValue(); + long timeMills = getTimeMills(shareInfo.getUpdateTime(), expr); + millisCheck(System.currentTimeMillis(), timeMills, shareInfo.getId()); } } } @@ -604,7 +593,7 @@ public class ShareInfoService { TestPlanReportContentWithBLOBs testPlanReportContent = testPlanReportContents.get(0); if (testPlanReportContent != null) { TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(testPlanReportContent.getTestPlanReportId()); - if(testPlanReport!=null){ + if (testPlanReport != null) { return testPlanMapper.selectByPrimaryKey(testPlanReport.getTestPlanId()); } @@ -613,8 +602,8 @@ public class ShareInfoService { return null; } - private void millisCheck(long compareMillis, long millis,String shareInfoId) { - if (compareMillis>millis) { + private void millisCheck(long compareMillis, long millis, String shareInfoId) { + if (compareMillis > millis) { shareInfoMapper.deleteByPrimaryKey(shareInfoId); MSException.throwException(Translator.get("connection_expired")); } diff --git a/frontend/src/business/components/api/definition/components/document/ApiDocumentAnchor.vue b/frontend/src/business/components/api/definition/components/document/ApiDocumentAnchor.vue index 1933027f31..f34932444d 100644 --- a/frontend/src/business/components/api/definition/components/document/ApiDocumentAnchor.vue +++ b/frontend/src/business/components/api/definition/components/document/ApiDocumentAnchor.vue @@ -332,6 +332,9 @@ export default { for (let dataIndex = 0; dataIndex < returnDatas.length; dataIndex++) { let index = indexArr[dataIndex]; let data = returnDatas[dataIndex]; + if (data.jsonSchemaBody) { + data.jsonSchemaBody = {raw:data.jsonSchemaBody}; + } this.$set(this.apiInfoArray, index, data); } this.updateShowArray(itemIndex, afterNodeIndex, beforeNodeIndex); diff --git a/frontend/src/business/components/api/definition/components/document/components/ApiRequestInfo.vue b/frontend/src/business/components/api/definition/components/document/components/ApiRequestInfo.vue index 3915042917..fa01a471f9 100644 --- a/frontend/src/business/components/api/definition/components/document/components/ApiRequestInfo.vue +++ b/frontend/src/business/components/api/definition/components/document/components/ApiRequestInfo.vue @@ -27,14 +27,10 @@ min-width="120px" show-overflow-tooltip/> -
+
-
- -