From db866363e3b6dddd0c83d71b199c1c630a0f7587 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Mon, 11 Apr 2022 17:55:52 +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=8DJSON=E5=AF=B9=E8=B1=A1=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96=E5=86=85=E5=AE=B9=E5=8C=85=E5=90=AB@type=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1012064 --user=赵勇 [接口测试]github#124031.19.2,已复测,post请求,请求体json类型,当属性名称为@type,值为正常的字符串,保存出现 http 500 https://www.tapd.cn/55049933/s/1132448 --- backend/pom.xml | 2 +- .../automation/parse/ApiScenarioImportUtil.java | 11 +++++++---- .../dto/automation/parse/MsScenarioParser.java | 2 +- .../dto/definition/parse/MsDefinitionParser.java | 2 +- .../definition/parse/PostmanDefinitionParser.java | 11 ++++++----- .../api/dto/definition/parse/Swagger3Parser.java | 12 ++++++++---- .../api/dto/definition/request/ElementUtil.java | 7 ++++--- .../api/dto/definition/request/MsScenario.java | 5 +++-- .../processors/post/MsJDBCPostProcessor.java | 3 ++- .../processors/pre/MsJDBCPreProcessor.java | 3 ++- .../request/sampler/MsDubboSampler.java | 3 ++- .../request/sampler/MsHTTPSamplerProxy.java | 3 ++- .../definition/request/sampler/MsJDBCSampler.java | 3 ++- .../definition/request/sampler/MsTCPSampler.java | 3 ++- .../io/metersphere/api/dto/scenario/Body.java | 2 +- .../api/exec/api/ApiExecuteService.java | 3 ++- .../api/exec/scenario/ApiScenarioEnvService.java | 3 ++- .../exec/scenario/ApiScenarioSerialService.java | 9 +++++---- .../api/exec/utils/GenerateHashTreeUtil.java | 7 ++++--- .../io/metersphere/api/jmeter/TestResult.java | 3 ++- .../io/metersphere/api/parse/old/MsParser.java | 4 ++-- .../api/service/ApiAutomationService.java | 12 +++++++++--- .../service/ApiScenarioReferenceIdService.java | 3 ++- .../ApiScenarioReportStructureService.java | 15 ++++++++------- .../api/service/ApiTestCaseService.java | 7 ++++--- .../api/service/MsHashTreeService.java | 11 ++++++----- .../io/metersphere/log/aspect/MsLogAspect.java | 6 +++--- 27 files changed, 93 insertions(+), 62 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index cf3edac98c..0d10a92f60 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -137,7 +137,7 @@ com.alibaba fastjson - 1.2.72 + 1.2.80 diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/parse/ApiScenarioImportUtil.java b/backend/src/main/java/io/metersphere/api/dto/automation/parse/ApiScenarioImportUtil.java index 53b5467e23..745dea0eb4 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/parse/ApiScenarioImportUtil.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/parse/ApiScenarioImportUtil.java @@ -3,6 +3,7 @@ package io.metersphere.api.dto.automation.parse; 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.ApiScenarioModuleDTO; import io.metersphere.api.dto.definition.ApiDefinitionResult; import io.metersphere.api.dto.definition.parse.ms.NodeTree; @@ -13,7 +14,10 @@ import io.metersphere.api.parse.ApiImportAbstractParser; import io.metersphere.api.service.ApiDefinitionService; import io.metersphere.api.service.ApiScenarioModuleService; import io.metersphere.api.service.ApiTestCaseService; -import io.metersphere.base.domain.*; +import io.metersphere.base.domain.ApiDefinition; +import io.metersphere.base.domain.ApiDefinitionExample; +import io.metersphere.base.domain.ApiScenarioModule; +import io.metersphere.base.domain.ApiTestCaseWithBLOBs; import io.metersphere.base.mapper.ApiDefinitionMapper; import io.metersphere.base.mapper.ApiTestCaseMapper; import io.metersphere.commons.constants.APITestStatus; @@ -22,7 +26,6 @@ import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.service.CheckPermissionService; import org.apache.commons.collections.CollectionUtils; - import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -208,7 +211,7 @@ public class ApiScenarioImportUtil { object.put("projectId", projectId); object.put("useEnvironment",""); object.put("url",""); - JSONObject objectNew = JSONObject.parseObject(object.toJSONString()); + JSONObject objectNew = JSONObject.parseObject(object.toJSONString(), Feature.DisableSpecialKeyDetect); objectNew.remove("refType"); objectNew.remove("referenced"); test.setRequest(objectNew.toJSONString()); @@ -249,7 +252,7 @@ public class ApiScenarioImportUtil { object.put("resourceId", apiTestCase.getId()); object.put("projectId", projectId); object.put("useEnvironment",""); - JSONObject objectNew = JSONObject.parseObject(object.toJSONString()); + JSONObject objectNew = JSONObject.parseObject(object.toJSONString(),Feature.DisableSpecialKeyDetect); objectNew.remove("refType"); objectNew.remove("referenced"); apiTestCase.setRequest(objectNew.toJSONString()); diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java index f0ee0f0899..bd7be133f0 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsScenarioParser.java @@ -61,7 +61,7 @@ public class MsScenarioParser extends MsAbstractParser { } private ScenarioImport parseMsFormat(String testStr, ApiTestImportRequest importRequest) { - ScenarioImport scenarioImport = JSON.parseObject(testStr, ScenarioImport.class); + ScenarioImport scenarioImport = JSON.parseObject(testStr, ScenarioImport.class,Feature.DisableSpecialKeyDetect); List data = scenarioImport.getData(); Set moduleIdSet = scenarioImport.getData().stream() diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/parse/MsDefinitionParser.java b/backend/src/main/java/io/metersphere/api/dto/definition/parse/MsDefinitionParser.java index cc89221985..28c136f386 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/parse/MsDefinitionParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/parse/MsDefinitionParser.java @@ -72,7 +72,7 @@ public class MsDefinitionParser extends MsAbstractParser { } private ApiDefinitionImport parseMsFormat(String testStr, ApiTestImportRequest importRequest) { - ApiDefinitionImport apiDefinitionImport = JSON.parseObject(testStr, ApiDefinitionImport.class); + ApiDefinitionImport apiDefinitionImport = JSON.parseObject(testStr, ApiDefinitionImport.class,Feature.DisableSpecialKeyDetect); Map> caseMap = new HashMap<>(); if (apiDefinitionImport.getCases() != null) { diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/parse/PostmanDefinitionParser.java b/backend/src/main/java/io/metersphere/api/dto/definition/parse/PostmanDefinitionParser.java index 008c4c7f0e..532cecee5f 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/parse/PostmanDefinitionParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/parse/PostmanDefinitionParser.java @@ -1,6 +1,7 @@ package io.metersphere.api.dto.definition.parse; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.parser.Feature; import io.metersphere.api.dto.ApiTestImportRequest; import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy; import io.metersphere.api.dto.parse.postman.PostmanCollection; @@ -9,15 +10,15 @@ import io.metersphere.api.dto.parse.postman.PostmanKeyValue; import io.metersphere.api.parse.PostmanAbstractParserParser; import io.metersphere.base.domain.ApiDefinitionWithBLOBs; import io.metersphere.base.domain.ApiModule; -import io.metersphere.commons.constants.ProjectApplicationType; -import io.metersphere.dto.ProjectConfig; -import io.metersphere.service.ProjectApplicationService; -import org.apache.commons.lang3.StringUtils; import io.metersphere.base.domain.ApiTestCaseWithBLOBs; import io.metersphere.base.domain.Project; import io.metersphere.base.mapper.ProjectMapper; +import io.metersphere.commons.constants.ProjectApplicationType; import io.metersphere.commons.utils.BeanUtils; import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.dto.ProjectConfig; +import io.metersphere.service.ProjectApplicationService; +import org.apache.commons.lang3.StringUtils; import java.io.InputStream; import java.util.*; @@ -32,7 +33,7 @@ public class PostmanDefinitionParser extends PostmanAbstractParserParser variables = postmanCollection.getVariable(); ApiDefinitionImport apiImport = new ApiDefinitionImport(); List results = new ArrayList<>(); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/parse/Swagger3Parser.java b/backend/src/main/java/io/metersphere/api/dto/definition/parse/Swagger3Parser.java index d795bce056..c24740b3a9 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/parse/Swagger3Parser.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/parse/Swagger3Parser.java @@ -3,10 +3,13 @@ package io.metersphere.api.dto.definition.parse; 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.ApiTestImportRequest; import io.metersphere.api.dto.definition.ApiModuleDTO; import io.metersphere.api.dto.definition.SwaggerApiExportResult; -import io.metersphere.api.dto.definition.parse.swagger.*; +import io.metersphere.api.dto.definition.parse.swagger.SwaggerApiInfo; +import io.metersphere.api.dto.definition.parse.swagger.SwaggerInfo; +import io.metersphere.api.dto.definition.parse.swagger.SwaggerParams; import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy; import io.metersphere.api.dto.definition.request.variable.JsonSchemaItem; import io.metersphere.api.dto.definition.response.HttpResponse; @@ -33,6 +36,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpMethod; + import java.io.InputStream; import java.util.*; @@ -594,17 +598,17 @@ public class Swagger3Parser extends SwaggerAbstractParser { } swaggerApiInfo.setTags(Arrays.asList(moduleName)); // 设置请求体 - JSONObject requestObject = JSON.parseObject(apiDefinition.getRequest()); // 将api的request属性转换成JSON对象以便获得参数 + JSONObject requestObject = JSON.parseObject(apiDefinition.getRequest(), Feature.DisableSpecialKeyDetect); // 将api的request属性转换成JSON对象以便获得参数 JSONObject requestBody = buildRequestBody(requestObject); swaggerApiInfo.setRequestBody(requestBody); // 设置响应体 - JSONObject responseObject = JSON.parseObject(apiDefinition.getResponse()); + JSONObject responseObject = JSON.parseObject(apiDefinition.getResponse(),Feature.DisableSpecialKeyDetect); swaggerApiInfo.setResponses(buildResponseBody(responseObject)); // 设置请求参数列表 List paramsList = buildParameters(requestObject); swaggerApiInfo.setParameters(paramsList); swaggerApiInfo.setDescription(apiDefinition.getDescription()); - JSONObject methodDetail = JSON.parseObject(JSON.toJSONString(swaggerApiInfo)); + JSONObject methodDetail = JSON.parseObject(JSON.toJSONString(swaggerApiInfo),Feature.DisableSpecialKeyDetect); if (paths.getJSONObject(apiDefinition.getPath()) == null) { paths.put(apiDefinition.getPath(), new JSONObject()); } // 一个路径下有多个发方法,如post,get,因此是一个 JSONObject 类型 diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java index 1868fcfb42..aa889620de 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java @@ -3,6 +3,7 @@ package io.metersphere.api.dto.definition.request; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -302,7 +303,7 @@ public class ElementUtil { } if (element.get("clazzName") == null && element.getString("type").equals("TCPSampler")) { if (element.getString("tcpPreProcessor") != null) { - JSONObject tcpPreProcessor = JSON.parseObject(element.getString("tcpPreProcessor")); + JSONObject tcpPreProcessor = JSON.parseObject(element.getString("tcpPreProcessor"), Feature.DisableSpecialKeyDetect); if (tcpPreProcessor != null && tcpPreProcessor.get("clazzName") == null) { tcpPreProcessor.fluentPut("clazzName", clazzMap.get(tcpPreProcessor.getString("type"))); element.fluentPut("tcpPreProcessor", tcpPreProcessor); @@ -310,7 +311,7 @@ public class ElementUtil { } } else if (element.getString("type").equals("HTTPSamplerProxy")) { if (element.getString("authManager") != null) { - JSONObject authManager = JSON.parseObject(element.getString("authManager")); + JSONObject authManager = JSON.parseObject(element.getString("authManager"),Feature.DisableSpecialKeyDetect); if (authManager != null && authManager.get("clazzName") == null) { authManager.fluentPut("clazzName", clazzMap.get(authManager.getString("type"))); element.fluentPut("authManager", authManager); @@ -388,7 +389,7 @@ public class ElementUtil { if (StringUtils.equals(environmentType, EnvironmentType.GROUP.name())) { environmentMap = environmentGroupProjectService.getEnvMap(environmentGroupId); } else if (StringUtils.equals(environmentType, EnvironmentType.JSON.name())) { - environmentMap = JSON.parseObject(environmentJson, Map.class); + environmentMap = JSON.parseObject(environmentJson, Map.class,Feature.DisableSpecialKeyDetect); } Map envConfig = new HashMap<>(16); if (environmentMap != null && !environmentMap.isEmpty()) { diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java index a299c39579..c7d3eecef0 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -216,7 +217,7 @@ public class MsScenario extends MsTestElement { mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ApiScenarioWithBLOBs scenario = apiAutomationService.selectByPrimaryKey(this.getId()); if (scenario != null && StringUtils.isNotEmpty(scenario.getScenarioDefinition())) { - JSONObject element = JSON.parseObject(scenario.getScenarioDefinition()); + JSONObject element = JSON.parseObject(scenario.getScenarioDefinition(), Feature.DisableSpecialKeyDetect); // 历史数据处理 ElementUtil.dataFormatting(element.getJSONArray("hashTree")); this.setName(scenario.getName()); @@ -260,7 +261,7 @@ public class MsScenario extends MsTestElement { if (StringUtils.equals(environmentType, EnvironmentType.GROUP.name())) { this.environmentMap = environmentGroupProjectService.getEnvMap(environmentGroupId); } else if (StringUtils.equals(environmentType, EnvironmentType.JSON.name())) { - this.environmentMap = JSON.parseObject(environmentJson, Map.class); + this.environmentMap = JSON.parseObject(environmentJson, Map.class,Feature.DisableSpecialKeyDetect); } } else { this.setEnvironmentEnable(false); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java index c0afa06f47..90a6c2bce2 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/post/MsJDBCPostProcessor.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -182,7 +183,7 @@ public class MsJDBCPostProcessor extends MsTestElement { if (bloBs != null) { this.setName(bloBs.getName()); this.setProjectId(bloBs.getProjectId()); - JSONObject element = JSON.parseObject(bloBs.getRequest()); + JSONObject element = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); proxy = mapper.readValue(element.toJSONString(), new TypeReference() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java index 9756cedb2e..af5f042e7e 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/processors/pre/MsJDBCPreProcessor.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -182,7 +183,7 @@ public class MsJDBCPreProcessor extends MsTestElement { if (bloBs != null) { this.setName(bloBs.getName()); this.setProjectId(bloBs.getProjectId()); - JSONObject element = JSON.parseObject(bloBs.getRequest()); + JSONObject element = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); proxy = mapper.readValue(element.toJSONString(), new TypeReference() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java index 0bb2c9b624..aafc204c27 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -116,7 +117,7 @@ public class MsDubboSampler extends MsTestElement { ApiTestCaseWithBLOBs bloBs = apiTestCaseService.get(this.getId()); if (bloBs != null) { this.setProjectId(bloBs.getProjectId()); - JSONObject element = JSON.parseObject(bloBs.getRequest()); + JSONObject element = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); proxy = mapper.readValue(element.toJSONString(), new TypeReference() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index 5224ecfd53..a939dddf36 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -289,7 +290,7 @@ public class MsHTTPSamplerProxy extends MsTestElement { ApiTestCaseWithBLOBs bloBs = CommonBeanFactory.getBean(ApiTestCaseService.class).get(this.getId()); if (bloBs != null) { this.setProjectId(bloBs.getProjectId()); - JSONObject element = JSON.parseObject(bloBs.getRequest()); + JSONObject element = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); proxy = mapper.readValue(element.toJSONString(), new TypeReference() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java index 83cacc5fb2..9ad6e2b149 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsJDBCSampler.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -240,7 +241,7 @@ public class MsJDBCSampler extends MsTestElement { if (bloBs != null) { this.setName(bloBs.getName()); this.setProjectId(bloBs.getProjectId()); - JSONObject element = JSON.parseObject(bloBs.getRequest()); + JSONObject element = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); proxy = mapper.readValue(element.toJSONString(), new TypeReference() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java index 67d3840eb7..cce4277b27 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsTCPSampler.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -195,7 +196,7 @@ public class MsTCPSampler extends MsTestElement { if (bloBs != null) { this.setName(bloBs.getName()); this.setProjectId(bloBs.getProjectId()); - JSONObject element = JSON.parseObject(bloBs.getRequest()); + JSONObject element = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); proxy = mapper.readValue(element.toJSONString(), new TypeReference() { }); diff --git a/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java b/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java index 7bab3ae75f..ea9613cbe7 100644 --- a/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java +++ b/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java @@ -97,7 +97,7 @@ public class Body { } else { try { if (StringUtils.isNotEmpty(this.getRaw())) { - JSONObject jsonObject = JSON.parseObject(this.getRaw(), Feature.OrderedField); + JSONObject jsonObject = JSON.parseObject(this.getRaw(), Feature.OrderedField,Feature.DisableSpecialKeyDetect); if (!this.getRaw().contains("$ref")) { jsonMockParse(jsonObject); } diff --git a/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java b/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java index 65bfc0c72a..9bbdbd2237 100644 --- a/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java +++ b/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java @@ -2,6 +2,7 @@ package io.metersphere.api.exec.api; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.metersphere.api.dto.definition.RunCaseRequest; @@ -192,7 +193,7 @@ public class ApiExecuteService { } public HashTree generateHashTree(RunCaseRequest request, ApiTestCaseWithBLOBs testCaseWithBLOBs) throws Exception { - JSONObject elementObj = JSON.parseObject(testCaseWithBLOBs.getRequest()); + JSONObject elementObj = JSON.parseObject(testCaseWithBLOBs.getRequest(), Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(elementObj); MsTestElement element = mapper.readValue(elementObj.toJSONString(), new TypeReference() { diff --git a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java index b667733bc9..01a5e60913 100644 --- a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java +++ b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioEnvService.java @@ -2,6 +2,7 @@ package io.metersphere.api.exec.scenario; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -177,7 +178,7 @@ public class ApiScenarioEnvService { if (apiScenario != null) { env.getProjectIds().add(apiScenario.getProjectId()); String scenarioDefinition = apiScenario.getScenarioDefinition(); - JSONObject element1 = JSON.parseObject(scenarioDefinition); + JSONObject element1 = JSON.parseObject(scenarioDefinition, Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element1); LinkedList hashTree1 = mapper.readValue(element1.getString("hashTree"), new TypeReference>() { }); diff --git a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java index 1772d1a814..bc1c2e89ec 100644 --- a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java +++ b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java @@ -2,6 +2,7 @@ package io.metersphere.api.exec.scenario; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.metersphere.api.dto.definition.request.ElementUtil; @@ -194,7 +195,7 @@ public class ApiScenarioSerialService { private MsTestElement parse(ApiTestCaseWithBLOBs caseWithBLOBs, String planId, String envId) { try { String api = caseWithBLOBs.getRequest(); - JSONObject element = JSON.parseObject(api); + JSONObject element = JSON.parseObject(api, Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); LinkedList list = new LinkedList<>(); @@ -205,7 +206,7 @@ public class ApiScenarioSerialService { list.addAll(elements); } if (element.getString("type").equals("HTTPSamplerProxy")) { - MsHTTPSamplerProxy httpSamplerProxy = JSON.parseObject(api, MsHTTPSamplerProxy.class); + MsHTTPSamplerProxy httpSamplerProxy = JSON.parseObject(api, MsHTTPSamplerProxy.class,Feature.DisableSpecialKeyDetect); httpSamplerProxy.setHashTree(list); httpSamplerProxy.setName(planId); if (StringUtils.isNotEmpty(envId)) { @@ -214,7 +215,7 @@ public class ApiScenarioSerialService { return httpSamplerProxy; } if (element.getString("type").equals("TCPSampler")) { - MsTCPSampler msTCPSampler = JSON.parseObject(api, MsTCPSampler.class); + MsTCPSampler msTCPSampler = JSON.parseObject(api, MsTCPSampler.class,Feature.DisableSpecialKeyDetect); if (StringUtils.isNotEmpty(envId)) { msTCPSampler.setUseEnvironment(envId); } @@ -223,7 +224,7 @@ public class ApiScenarioSerialService { return msTCPSampler; } if (element.getString("type").equals("DubboSampler")) { - MsDubboSampler dubboSampler = JSON.parseObject(api, MsDubboSampler.class); + MsDubboSampler dubboSampler = JSON.parseObject(api, MsDubboSampler.class,Feature.DisableSpecialKeyDetect); if (StringUtils.isNotEmpty(envId)) { dubboSampler.setUseEnvironment(envId); } diff --git a/backend/src/main/java/io/metersphere/api/exec/utils/GenerateHashTreeUtil.java b/backend/src/main/java/io/metersphere/api/exec/utils/GenerateHashTreeUtil.java index 0faf6a27ed..8025d49ea7 100644 --- a/backend/src/main/java/io/metersphere/api/exec/utils/GenerateHashTreeUtil.java +++ b/backend/src/main/java/io/metersphere/api/exec/utils/GenerateHashTreeUtil.java @@ -2,6 +2,7 @@ package io.metersphere.api.exec.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -38,7 +39,7 @@ public class GenerateHashTreeUtil { public static MsScenario parseScenarioDefinition(String scenarioDefinition) { if (StringUtils.isNotEmpty(scenarioDefinition)) { - MsScenario scenario = JSONObject.parseObject(scenarioDefinition, MsScenario.class); + MsScenario scenario = JSONObject.parseObject(scenarioDefinition, MsScenario.class, Feature.DisableSpecialKeyDetect); if (scenario != null) { parse(scenarioDefinition, scenario); } @@ -51,7 +52,7 @@ public class GenerateHashTreeUtil { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); try { - JSONObject element = JSON.parseObject(scenarioDefinition); + JSONObject element = JSON.parseObject(scenarioDefinition, Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); // 多态JSON普通转换会丢失内容,需要通过 ObjectMapper 获取 if (element != null && StringUtils.isNotEmpty(element.getString("hashTree"))) { @@ -74,7 +75,7 @@ public class GenerateHashTreeUtil { public static LinkedList getScenarioHashTree(String definition) { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - JSONObject element = JSON.parseObject(definition); + JSONObject element = JSON.parseObject(definition, Feature.DisableSpecialKeyDetect); try { if (element != null) { ElementUtil.dataFormatting(element); diff --git a/backend/src/main/java/io/metersphere/api/jmeter/TestResult.java b/backend/src/main/java/io/metersphere/api/jmeter/TestResult.java index db0a5cda64..1ef5a0a537 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/TestResult.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/TestResult.java @@ -2,6 +2,7 @@ package io.metersphere.api.jmeter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.parser.Feature; import io.metersphere.commons.constants.DelimiterConstants; import io.metersphere.dto.RequestResult; import lombok.Data; @@ -135,7 +136,7 @@ public class TestResult { String itemAndScenarioName = ""; if (StringUtils.isNotEmpty(item.getScenario())) { //第1个:当前场景, 第all_id_names个:最后一层场景 - List all_id_names = JSON.parseObject(item.getScenario(), List.class); + List all_id_names = JSON.parseObject(item.getScenario(), List.class, Feature.DisableSpecialKeyDetect); if (all_id_names.size() > 1) { StringBuffer scenarioNames = new StringBuffer(); //因为要进行步骤统计,第一层级下的场景算作步骤,所以统计视角只按照第一级别场景来计算 diff --git a/backend/src/main/java/io/metersphere/api/parse/old/MsParser.java b/backend/src/main/java/io/metersphere/api/parse/old/MsParser.java index 5ec129288c..d4b0fd1c67 100644 --- a/backend/src/main/java/io/metersphere/api/parse/old/MsParser.java +++ b/backend/src/main/java/io/metersphere/api/parse/old/MsParser.java @@ -18,7 +18,7 @@ public class MsParser extends ApiImportAbstractParser { @Override public ApiImport parse(InputStream source, ApiTestImportRequest request) { String testStr = getApiTestStr(source); - ApiImport apiImport = JSON.parseObject(parsePluginFormat(testStr), ApiImport.class); + ApiImport apiImport = JSON.parseObject(parsePluginFormat(testStr), ApiImport.class,Feature.DisableSpecialKeyDetect); apiImport.getScenarios().forEach(scenario -> setScenarioByRequest(scenario, request)); return apiImport; } @@ -26,7 +26,7 @@ public class MsParser extends ApiImportAbstractParser { @Override public ApiDefinitionImport parseApi(InputStream source, ApiTestImportRequest request) { String testStr = getApiTestStr(source); - ApiDefinitionImport apiImport = JSON.parseObject(testStr, ApiDefinitionImport.class); + ApiDefinitionImport apiImport = JSON.parseObject(testStr, ApiDefinitionImport.class,Feature.DisableSpecialKeyDetect); return apiImport; } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index da402567e6..6f311a2397 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.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.*; import io.metersphere.api.dto.automation.*; import io.metersphere.api.dto.automation.parse.ApiScenarioImportUtil; @@ -402,7 +403,7 @@ public class ApiAutomationService { if (scenario == null || StringUtils.isEmpty(scenario.getScenarioDefinition())) { return; } - JSONObject element = JSON.parseObject(scenario.getScenarioDefinition()); + JSONObject element = JSON.parseObject(scenario.getScenarioDefinition(), Feature.DisableSpecialKeyDetect); JSONArray hashTree = element.getJSONArray("hashTree"); ApiScenarioImportUtil.formatHashTree(hashTree); setReferenced(hashTree, scenario.getVersionId(), scenario.getProjectId(), apiTestCaseMapper, apiDefinitionMapper, true); @@ -692,7 +693,7 @@ public class ApiAutomationService { public ApiScenarioDTO getNewApiScenario(String id) { ApiScenarioDTO scenarioWithBLOBs = extApiScenarioMapper.selectById(id); if (scenarioWithBLOBs != null && StringUtils.isNotEmpty(scenarioWithBLOBs.getScenarioDefinition())) { - JSONObject element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition()); + JSONObject element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition(), Feature.DisableSpecialKeyDetect); hashTreeService.dataFormatting(element); scenarioWithBLOBs.setScenarioDefinition(JSON.toJSONString(element)); } @@ -702,7 +703,7 @@ public class ApiAutomationService { public String setDomain(ApiScenarioEnvRequest request) { Boolean enable = request.getEnvironmentEnable(); String scenarioDefinition = request.getDefinition(); - JSONObject element = JSON.parseObject(scenarioDefinition); + JSONObject element = JSON.parseObject(scenarioDefinition, Feature.DisableSpecialKeyDetect); Map environmentMap = new HashMap<>(); if (BooleanUtils.isFalse(enable)) { String envType = request.getEnvironmentType(); @@ -2074,4 +2075,9 @@ public class ApiAutomationService { } } + public static void main(String args[]) { + String s = "{\"id\":\"a0b24269-96af-4e38-9527-abb8de9e298a\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"tags\":\"[]\",\"userId\":\"zhaoyong\",\"apiScenarioModuleId\":\"91b7822c-265f-4304-8256-92b7f862dbc5\",\"modulePath\":\"/MeterSphere-test\",\"name\":\"创建测试\",\"level\":\"P0\",\"status\":\"Underway\",\"principal\":\"zhaoyong\",\"stepTotal\":2,\"schedule\":null,\"createTime\":1649660714601,\"updateTime\":1649663715536,\"passRate\":\"0%\",\"lastResult\":\"Fail\",\"reportId\":\"aae35c28\",\"num\":100115,\"originalState\":null,\"customNum\":\"100115\",\"createUser\":null,\"version\":10,\"deleteTime\":null,\"deleteUserId\":null,\"executeTimes\":null,\"order\":null,\"environmentType\":\"JSON\",\"environmentGroupId\":null,\"versionId\":\"5b78930e-6880-11ec-a810-0242ac1e0a05\",\"refId\":\"a0b24269-96af-4e38-9527-abb8de9e298a\",\"latest\":null,\"scenarioDefinition\":{\"id\":\"a0b24269-96af-4e38-9527-abb8de9e298a\",\"enableCookieShare\":false,\"name\":\"创建测试\",\"type\":\"scenario\",\"clazzName\":\"io.metersphere.api.dto.definition.request.MsScenario\",\"variables\":[],\"headers\":[],\"referenced\":\"Created\",\"environmentMap\":{\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\":\"bdb7c2cb-76ba-4761-bdc1-dc136c492124\"},\"hashTree\":[{\"resourceId\":\"11335d47-ed41-2934-ecf8-150232d8d71d\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"password\":{\"hidden\":true,\"mock\":{\"mock\":\"Calong@2015\"},\"title\":\"The password Schema\",\"type\":\"string\",\"$id\":\"#/properties/password\"},\"username\":{\"hidden\":true,\"mock\":{\"mock\":\"admin\"},\"title\":\"The username Schema\",\"type\":\"string\",\"$id\":\"#/properties/username\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[],\"raw\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"Calong@2015\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/signin\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"resourceId\":\"4454ea7f-5c0e-4e1b-b66a-7fb925fc5b4c\",\"mockEnvironment\":false,\"active\":true,\"index\":1,\"type\":\"Extract\",\"regex\":[{\"valid\":true,\"expression\":\"Set-Cookie: (.*?); Path=/; HttpOnly;\",\"variable\":\"Cookie\",\"useHeaders\":\"true\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${Cookie}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.*?)\\\"\",\"variable\":\"id\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.+?)\\\"\",\"variable\":\"id2\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id2}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(\\\\d+)\\\"\",\"variable\":\"id3\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id3}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.\\\\d+)\\\"\",\"variable\":\"id4\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id4}\"}],\"xpath\":[],\"enable\":true,\"json\":[{\"valid\":true,\"expression\":\"$.data.csrfToken\",\"variable\":\"csrfToken\",\"multipleMatching\":false,\"type\":\"JSONPath\",\"value\":\"\"}],\"hashTree\":[],\"id\":\"bec13d6d-3dc0-3f20-ff73-d4fb0b8dcc99\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.extract.MsExtract\",\"parentIndex\":\"1_1\",\"checkBox\":false,\"isLeaf\":true},{\"jsr223\":[],\"resourceId\":\"5f22b989-279b-4417-b896-c3cbcdfd7448\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":2,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"e233298c-845b-5a48-8968-06266ebe775e\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"1_2\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"4975f880-cb88-539d-38c6-01f134011946\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true}],\"rest\":[],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":false,\"index\":1,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"登录ms\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":1,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true},{\"resourceId\":\"459089ec-eb03-c66b-1e81-9d6b5905a54f\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"$id\":\"http://example.com/root.json\",\"title\":\"The Root Schema\",\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"@type\":{\"$id\":\"#/properties/@type\",\"title\":\"The @type Schema\",\"hidden\":true,\"mock\":{\"mock\":\"aaa\"},\"type\":\"string\"}}},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"request\",\"type\":\"text\",\"contentType\":\"application/json;boundary=----WebKitFormBoundarybikQMdDG93ZCVD4V\",\"urlEncode\":false,\"value\":\"{\\\"name\\\":\\\"测试1\\\",\\\"module\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"nodePath\\\":\\\"/未规划用例\\\",\\\"maintainer\\\":\\\"zyy\\\",\\\"priority\\\":\\\"P0\\\",\\\"type\\\":\\\"functional\\\",\\\"method\\\":\\\"\\\",\\\"prerequisite\\\":\\\"\\\",\\\"testId\\\":\\\"[]\\\",\\\"otherTestName\\\":\\\"\\\",\\\"steps\\\":\\\"[{\\\\\\\"num\\\\\\\":1,\\\\\\\"desc\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"result\\\\\\\":\\\\\\\"\\\\\\\"}]\\\",\\\"stepDesc\\\":\\\"\\\",\\\"stepResult\\\":\\\"\\\",\\\"selected\\\":[],\\\"remark\\\":\\\"\\\",\\\"tags\\\":\\\"[]\\\",\\\"demandId\\\":\\\"\\\",\\\"demandName\\\":\\\"\\\",\\\"status\\\":\\\"Prepare\\\",\\\"reviewStatus\\\":\\\"Prepare\\\",\\\"stepDescription\\\":\\\"\\\",\\\"expectedResult\\\":\\\"\\\",\\\"stepModel\\\":null,\\\"customNum\\\":\\\"\\\",\\\"followPeople\\\":\\\"\\\",\\\"follows\\\":[],\\\"customFields\\\":\\\"[{\\\\\\\"id\\\\\\\":\\\\\\\"ea902d54-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"责任人\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"zyy\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"member\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea91b4b1-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例等级\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"P0\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea991a6c-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例状态\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"Prepare\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null}]\\\",\\\"nodeId\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"projectId\\\":\\\"a79ac4e6-c3b7-4d82-8f11-b1c9be05c396\\\",\\\"casePublic\\\":false,\\\"updatedFileList\\\":[]}\",\"required\":false},{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"raw\":\"{\\n \\\"@type\\\": \\\"aaa\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/test/case/add\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"jsr223\":[],\"resourceId\":\"f318347e-2a8f-4bbe-9753-506156d44656\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":1,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"aaa65613-b39c-dc42-852d-17e47366c6cb\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"2_1\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"ab259fed-5328-71f7-8079-e05783a82499\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"CSRF-TOKEN\",\"urlEncode\":false,\"value\":\"${csrfToken}\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Cookie\",\"urlEncode\":false,\"value\":\"${Cookie}\",\"required\":true},{\"valid\":false,\"file\":false,\"enable\":true,\"urlEncode\":false,\"required\":true}],\"rest\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":true,\"index\":2,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"创建功能用例\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":2,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true,\"preSize\":0,\"postSize\":0,\"ruleSize\":0}],\"onSampleError\":true,\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\"},\"description\":null,\"useUrl\":null,\"environmentJson\":\"{\\\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\\\":\\\"bdb7c2cb-76ba-4761-bdc1-dc136c492124\\\"}\",\"projectName\":\"默认项目\",\"userName\":\"zz\",\"creatorName\":\"zz\",\"principalName\":\"zz\",\"tagNames\":null,\"deleteUser\":null,\"versionName\":\"v1.0.0\",\"versionEnable\":null,\"projectIds\":null,\"caseId\":null,\"environment\":null,\"env\":\"{\\\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\\\":\\\"bdb7c2cb-76ba-4761-bdc1-dc136c492124\\\"}\",\"environmentMap\":{\"默认项目\":\"JD\"},\"creator\":\"zhaoyong\",\"showBatchTip\":true,\"variables\":[],\"headers\":[],\"scenarioDefinitionOrg\":{\"apiScenarioModuleId\":\"91b7822c-265f-4304-8256-92b7f862dbc5\",\"name\":\"创建测试\",\"status\":\"Underway\",\"principal\":\"zhaoyong\",\"level\":\"P0\",\"tags\":[],\"description\":null,\"scenarioDefinition\":[{\"resourceId\":\"11335d47-ed41-2934-ecf8-150232d8d71d\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"password\":{\"hidden\":true,\"mock\":{\"mock\":\"Calong@2015\"},\"title\":\"The password Schema\",\"type\":\"string\",\"$id\":\"#/properties/password\"},\"username\":{\"hidden\":true,\"mock\":{\"mock\":\"admin\"},\"title\":\"The username Schema\",\"type\":\"string\",\"$id\":\"#/properties/username\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[],\"raw\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"Calong@2015\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/signin\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"resourceId\":\"4454ea7f-5c0e-4e1b-b66a-7fb925fc5b4c\",\"mockEnvironment\":false,\"active\":true,\"index\":1,\"type\":\"Extract\",\"regex\":[{\"valid\":true,\"expression\":\"Set-Cookie: (.*?); Path=/; HttpOnly;\",\"variable\":\"Cookie\",\"useHeaders\":\"true\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${Cookie}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.*?)\\\"\",\"variable\":\"id\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.+?)\\\"\",\"variable\":\"id2\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id2}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(\\\\d+)\\\"\",\"variable\":\"id3\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id3}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.\\\\d+)\\\"\",\"variable\":\"id4\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id4}\"}],\"xpath\":[],\"enable\":true,\"json\":[{\"valid\":true,\"expression\":\"$.data.csrfToken\",\"variable\":\"csrfToken\",\"multipleMatching\":false,\"type\":\"JSONPath\",\"value\":\"\"}],\"hashTree\":[],\"id\":\"bec13d6d-3dc0-3f20-ff73-d4fb0b8dcc99\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.extract.MsExtract\",\"parentIndex\":\"1_1\"},{\"jsr223\":[],\"resourceId\":\"5f22b989-279b-4417-b896-c3cbcdfd7448\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":2,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"e233298c-845b-5a48-8968-06266ebe775e\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"1_2\"}],\"id\":\"4975f880-cb88-539d-38c6-01f134011946\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true}],\"rest\":[],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":false,\"index\":1,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"登录ms\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":1},{\"resourceId\":\"459089ec-eb03-c66b-1e81-9d6b5905a54f\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"\\\\@type\":{\"hidden\":true,\"mock\":{\"mock\":\"aaa\"},\"title\":\"The \\\\@type Schema\",\"type\":\"string\",\"$id\":\"#/properties/\\\\@type\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"request\",\"type\":\"text\",\"contentType\":\"application/json;boundary=----WebKitFormBoundarybikQMdDG93ZCVD4V\",\"urlEncode\":false,\"value\":\"{\\\"name\\\":\\\"测试1\\\",\\\"module\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"nodePath\\\":\\\"/未规划用例\\\",\\\"maintainer\\\":\\\"zyy\\\",\\\"priority\\\":\\\"P0\\\",\\\"type\\\":\\\"functional\\\",\\\"method\\\":\\\"\\\",\\\"prerequisite\\\":\\\"\\\",\\\"testId\\\":\\\"[]\\\",\\\"otherTestName\\\":\\\"\\\",\\\"steps\\\":\\\"[{\\\\\\\"num\\\\\\\":1,\\\\\\\"desc\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"result\\\\\\\":\\\\\\\"\\\\\\\"}]\\\",\\\"stepDesc\\\":\\\"\\\",\\\"stepResult\\\":\\\"\\\",\\\"selected\\\":[],\\\"remark\\\":\\\"\\\",\\\"tags\\\":\\\"[]\\\",\\\"demandId\\\":\\\"\\\",\\\"demandName\\\":\\\"\\\",\\\"status\\\":\\\"Prepare\\\",\\\"reviewStatus\\\":\\\"Prepare\\\",\\\"stepDescription\\\":\\\"\\\",\\\"expectedResult\\\":\\\"\\\",\\\"stepModel\\\":null,\\\"customNum\\\":\\\"\\\",\\\"followPeople\\\":\\\"\\\",\\\"follows\\\":[],\\\"customFields\\\":\\\"[{\\\\\\\"id\\\\\\\":\\\\\\\"ea902d54-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"责任人\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"zyy\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"member\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea91b4b1-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例等级\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"P0\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea991a6c-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例状态\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"Prepare\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null}]\\\",\\\"nodeId\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"projectId\\\":\\\"a79ac4e6-c3b7-4d82-8f11-b1c9be05c396\\\",\\\"casePublic\\\":false,\\\"updatedFileList\\\":[]}\",\"required\":false},{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"raw\":\"{\\n \\\"\\\\\\\\@type\\\": \\\"aaa\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/test/case/add\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"jsr223\":[],\"resourceId\":\"f318347e-2a8f-4bbe-9753-506156d44656\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":1,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"aaa65613-b39c-dc42-852d-17e47366c6cb\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"2_1\"}],\"id\":\"ab259fed-5328-71f7-8079-e05783a82499\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"CSRF-TOKEN\",\"urlEncode\":false,\"value\":\"${csrfToken}\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Cookie\",\"urlEncode\":false,\"value\":\"${Cookie}\",\"required\":true},{\"valid\":false,\"file\":false,\"enable\":true,\"urlEncode\":false,\"required\":true}],\"rest\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":true,\"index\":2,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"创建功能用例\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":2}]},\"follows\":[],\"hashTree\":[{\"resourceId\":\"11335d47-ed41-2934-ecf8-150232d8d71d\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"title\":\"The Root Schema\",\"type\":\"object\",\"properties\":{\"password\":{\"hidden\":true,\"mock\":{\"mock\":\"Calong@2015\"},\"title\":\"The password Schema\",\"type\":\"string\",\"$id\":\"#/properties/password\"},\"username\":{\"hidden\":true,\"mock\":{\"mock\":\"admin\"},\"title\":\"The username Schema\",\"type\":\"string\",\"$id\":\"#/properties/username\"}},\"$id\":\"http://example.com/root.json\"},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[],\"raw\":\"{\\n \\\"username\\\": \\\"admin\\\",\\n \\\"password\\\": \\\"Calong@2015\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/signin\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"resourceId\":\"4454ea7f-5c0e-4e1b-b66a-7fb925fc5b4c\",\"mockEnvironment\":false,\"active\":true,\"index\":1,\"type\":\"Extract\",\"regex\":[{\"valid\":true,\"expression\":\"Set-Cookie: (.*?); Path=/; HttpOnly;\",\"variable\":\"Cookie\",\"useHeaders\":\"true\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${Cookie}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.*?)\\\"\",\"variable\":\"id\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.+?)\\\"\",\"variable\":\"id2\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id2}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(\\\\d+)\\\"\",\"variable\":\"id3\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id3}\"},{\"valid\":true,\"expression\":\"\\\"id\\\":\\\"(.\\\\d+)\\\"\",\"variable\":\"id4\",\"useHeaders\":\"false\",\"multipleMatching\":false,\"type\":\"Regex\",\"value\":\"${id4}\"}],\"xpath\":[],\"enable\":true,\"json\":[{\"valid\":true,\"expression\":\"$.data.csrfToken\",\"variable\":\"csrfToken\",\"multipleMatching\":false,\"type\":\"JSONPath\",\"value\":\"\"}],\"hashTree\":[],\"id\":\"bec13d6d-3dc0-3f20-ff73-d4fb0b8dcc99\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.extract.MsExtract\",\"parentIndex\":\"1_1\",\"checkBox\":false,\"isLeaf\":true},{\"jsr223\":[],\"resourceId\":\"5f22b989-279b-4417-b896-c3cbcdfd7448\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":2,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"e233298c-845b-5a48-8968-06266ebe775e\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"1_2\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"4975f880-cb88-539d-38c6-01f134011946\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true}],\"rest\":[],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":false,\"index\":1,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"登录ms\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":1,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true},{\"resourceId\":\"459089ec-eb03-c66b-1e81-9d6b5905a54f\",\"num\":\"\",\"refType\":\"CASE\",\"type\":\"HTTPSamplerProxy\",\"body\":{\"valid\":true,\"jsonSchema\":{\"$id\":\"http://example.com/root.json\",\"title\":\"The Root Schema\",\"hidden\":true,\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"@type\":{\"$id\":\"#/properties/@type\",\"title\":\"The @type Schema\",\"hidden\":true,\"mock\":{\"mock\":\"aaa\"},\"type\":\"string\"}}},\"xml\":false,\"binary\":[],\"json\":true,\"kvs\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"request\",\"type\":\"text\",\"contentType\":\"application/json;boundary=----WebKitFormBoundarybikQMdDG93ZCVD4V\",\"urlEncode\":false,\"value\":\"{\\\"name\\\":\\\"测试1\\\",\\\"module\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"nodePath\\\":\\\"/未规划用例\\\",\\\"maintainer\\\":\\\"zyy\\\",\\\"priority\\\":\\\"P0\\\",\\\"type\\\":\\\"functional\\\",\\\"method\\\":\\\"\\\",\\\"prerequisite\\\":\\\"\\\",\\\"testId\\\":\\\"[]\\\",\\\"otherTestName\\\":\\\"\\\",\\\"steps\\\":\\\"[{\\\\\\\"num\\\\\\\":1,\\\\\\\"desc\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"result\\\\\\\":\\\\\\\"\\\\\\\"}]\\\",\\\"stepDesc\\\":\\\"\\\",\\\"stepResult\\\":\\\"\\\",\\\"selected\\\":[],\\\"remark\\\":\\\"\\\",\\\"tags\\\":\\\"[]\\\",\\\"demandId\\\":\\\"\\\",\\\"demandName\\\":\\\"\\\",\\\"status\\\":\\\"Prepare\\\",\\\"reviewStatus\\\":\\\"Prepare\\\",\\\"stepDescription\\\":\\\"\\\",\\\"expectedResult\\\":\\\"\\\",\\\"stepModel\\\":null,\\\"customNum\\\":\\\"\\\",\\\"followPeople\\\":\\\"\\\",\\\"follows\\\":[],\\\"customFields\\\":\\\"[{\\\\\\\"id\\\\\\\":\\\\\\\"ea902d54-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"责任人\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"zyy\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"member\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea91b4b1-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例等级\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"P0\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null},{\\\\\\\"id\\\\\\\":\\\\\\\"ea991a6c-ab30-11ec-bfae-0242ac1e0a02\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"用例状态\\\\\\\",\\\\\\\"value\\\\\\\":\\\\\\\"Prepare\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"select\\\\\\\",\\\\\\\"customData\\\\\\\":null}]\\\",\\\"nodeId\\\":\\\"f9ee3850-e0a4-4529-99f8-24c6cb9a5e57\\\",\\\"projectId\\\":\\\"a79ac4e6-c3b7-4d82-8f11-b1c9be05c396\\\",\\\"casePublic\\\":false,\\\"updatedFileList\\\":[]}\",\"required\":false},{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"raw\":\"{\\n \\\"@type\\\": \\\"aaa\\\"\\n}\",\"kV\":false,\"oldKV\":false,\"type\":\"JSON\"},\"path\":\"/test/case/add\",\"protocol\":\"HTTP\",\"enable\":true,\"followRedirects\":true,\"useEnvironment\":\"ec29256c-9523-48ff-b257-755f5daccb60\",\"connectTimeout\":\"60000\",\"hashTree\":[{\"jsr223\":[],\"resourceId\":\"f318347e-2a8f-4bbe-9753-506156d44656\",\"mockEnvironment\":false,\"document\":{\"data\":{\"xml\":[],\"json\":[],\"xmlFollowAPI\":\"false\",\"jsonFollowAPI\":\"false\"},\"enable\":true,\"type\":\"JSON\"},\"xpath2\":[],\"active\":false,\"index\":1,\"jsonPath\":[],\"type\":\"Assertions\",\"duration\":{\"valid\":false,\"enable\":true,\"type\":\"Duration\",\"value\":0},\"regex\":[],\"enable\":true,\"hashTree\":[],\"id\":\"aaa65613-b39c-dc42-852d-17e47366c6cb\",\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.assertions.MsAssertions\",\"parentIndex\":\"2_1\",\"checkBox\":false,\"isLeaf\":true}],\"id\":\"ab259fed-5328-71f7-8079-e05783a82499\",\"responseTimeout\":\"60000\",\"headers\":[{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Content-Type\",\"urlEncode\":false,\"value\":\"application/json\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"CSRF-TOKEN\",\"urlEncode\":false,\"value\":\"${csrfToken}\",\"required\":true},{\"valid\":true,\"file\":false,\"enable\":true,\"name\":\"Cookie\",\"urlEncode\":false,\"value\":\"${Cookie}\",\"required\":true},{\"valid\":false,\"file\":false,\"enable\":true,\"urlEncode\":false,\"required\":true}],\"rest\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"mockEnvironment\":false,\"method\":\"POST\",\"active\":true,\"index\":2,\"url\":\"\",\"customizeReq\":false,\"referenced\":\"Copy\",\"domain\":\"https://www.jd.com\",\"name\":\"创建功能用例\",\"isRefEnvironment\":true,\"arguments\":[{\"valid\":false,\"file\":false,\"enable\":true,\"type\":\"text\",\"contentType\":\"text/plain\",\"urlEncode\":false,\"required\":false}],\"projectId\":\"a55ec10b-53ec-11ec-8069-0242ac1e0a04\",\"clazzName\":\"io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy\",\"doMultipartPost\":false,\"parentIndex\":2,\"requestResult\":[{\"responseResult\":{}}],\"checkBox\":false,\"isBatchProcess\":false,\"isLeaf\":true,\"preSize\":0,\"postSize\":0,\"ruleSize\":0}]}"; + JSONObject element = JSON.parseObject(s, Feature.DisableSpecialKeyDetect); + System.out.println(element); + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java index 73433dacbe..b0e5015e73 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java @@ -2,6 +2,7 @@ package io.metersphere.api.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import io.metersphere.base.domain.ApiScenarioReferenceId; import io.metersphere.base.domain.ApiScenarioReferenceIdExample; import io.metersphere.base.domain.ApiScenarioWithBLOBs; @@ -55,7 +56,7 @@ public class ApiScenarioReferenceIdService { this.deleteByScenarioId(scenario.getId()); Map referenceIdMap = new HashMap<>(); if (StringUtils.isNotEmpty(scenario.getScenarioDefinition())) { - JSONObject jsonObject = JSONObject.parseObject(scenario.getScenarioDefinition()); + JSONObject jsonObject = JSONObject.parseObject(scenario.getScenarioDefinition(), Feature.DisableSpecialKeyDetect); if (!jsonObject.containsKey(MsHashTreeService.HASH_TREE)) { return; } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportStructureService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportStructureService.java index 5fee5456cc..60386f0aa6 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportStructureService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportStructureService.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.ApiScenarioReportDTO; import io.metersphere.api.dto.RequestResultExpandDTO; import io.metersphere.api.dto.StepTreeDTO; @@ -84,7 +85,7 @@ public class ApiScenarioReportStructureService { } public static StepTreeDTO dataFormatting(ApiScenarioWithBLOBs apiScenario, String reportType) { - JSONObject element = JSON.parseObject(apiScenario.getScenarioDefinition()); + JSONObject element = JSON.parseObject(apiScenario.getScenarioDefinition(), Feature.DisableSpecialKeyDetect); StepTreeDTO dto = null; if (element != null && element.getBoolean("enable")) { element = getRefElement(element); @@ -112,7 +113,7 @@ public class ApiScenarioReportStructureService { if (StringUtils.equals(element.getString("type"), "scenario")) { ApiScenarioWithBLOBs scenarioWithBLOBs = CommonBeanFactory.getBean(ApiScenarioMapper.class).selectByPrimaryKey(element.getString("id")); if (scenarioWithBLOBs != null) { - return JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition()); + return JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition(),Feature.DisableSpecialKeyDetect); } } } @@ -246,18 +247,18 @@ public class ApiScenarioReportStructureService { if (reportResults.size() > 1) { for (int i = 0; i < reportResults.size(); i++) { if (i == 0) { - dto.setValue(JSON.parseObject(new String(reportResults.get(i).getContent(), StandardCharsets.UTF_8), RequestResult.class)); + dto.setValue(JSON.parseObject(new String(reportResults.get(i).getContent(), StandardCharsets.UTF_8), RequestResult.class,Feature.DisableSpecialKeyDetect)); dto.setErrorCode(reportResults.get(0).getErrorCode()); } else { StepTreeDTO step = new StepTreeDTO(dto.getLabel(), UUID.randomUUID().toString(), dto.getType(), (i + 1)); - step.setValue(JSON.parseObject(new String(reportResults.get(i).getContent(), StandardCharsets.UTF_8), RequestResult.class)); + step.setValue(JSON.parseObject(new String(reportResults.get(i).getContent(), StandardCharsets.UTF_8), RequestResult.class,Feature.DisableSpecialKeyDetect)); step.setErrorCode(reportResults.get(i).getErrorCode()); dtoList.add(step); } } } else { String content = new String(reportResults.get(0).getContent(), StandardCharsets.UTF_8); - dto.setValue(JSON.parseObject(content, RequestResult.class)); + dto.setValue(JSON.parseObject(content, RequestResult.class,Feature.DisableSpecialKeyDetect)); dto.setErrorCode(reportResults.get(0).getErrorCode()); } } @@ -385,10 +386,10 @@ public class ApiScenarioReportStructureService { BeanUtils.copyBean(vo, item); if (StringUtils.isNotEmpty(item.getContent())) { try { - RequestResultExpandDTO resultExpandDTO = JSON.parseObject(item.getContent(), RequestResultExpandDTO.class); + RequestResultExpandDTO resultExpandDTO = JSON.parseObject(item.getContent(), RequestResultExpandDTO.class,Feature.DisableSpecialKeyDetect); vo.setRequestResult(resultExpandDTO); } catch (Exception e) { - vo.setRequestResult(JSON.parseObject(item.getContent(), RequestResult.class)); + vo.setRequestResult(JSON.parseObject(item.getContent(), RequestResult.class,Feature.DisableSpecialKeyDetect)); } if (vo.getRequestResult() != null) { vo.setPassAssertions(vo.getRequestResult().getPassAssertions()); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java index 1e9c0a97d3..9b86bdf573 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java @@ -2,6 +2,7 @@ package io.metersphere.api.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.metersphere.api.dto.ApiCaseEditRequest; @@ -705,7 +706,7 @@ public class ApiTestCaseService { ApiTestCaseMapper batchMapper = sqlSession.getMapper(ApiTestCaseMapper.class); bloBs.forEach(apiTestCase -> { - JSONObject req = JSON.parseObject(apiTestCase.getRequest()); + JSONObject req = JSON.parseObject(apiTestCase.getRequest(), Feature.DisableSpecialKeyDetect); req.put("useEnvironment", request.getEnvId()); String requestStr = JSON.toJSONString(req); apiTestCase.setRequest(requestStr); @@ -727,9 +728,9 @@ public class ApiTestCaseService { ApiTestCaseMapper batchMapper = sqlSession.getMapper(ApiTestCaseMapper.class); bloBs.forEach(apiTestCase -> { - MsHTTPSamplerProxy req = JSON.parseObject(apiTestCase.getRequest(), MsHTTPSamplerProxy.class); + MsHTTPSamplerProxy req = JSON.parseObject(apiTestCase.getRequest(), MsHTTPSamplerProxy.class,Feature.DisableSpecialKeyDetect); try { - JSONObject element = JSON.parseObject(apiTestCase.getRequest()); + JSONObject element = JSON.parseObject(apiTestCase.getRequest(),Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(element); if (element != null && StringUtils.isNotEmpty(element.getString("hashTree"))) { diff --git a/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java b/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java index 154d343766..f2f3427ccc 100644 --- a/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.java +++ b/backend/src/main/java/io/metersphere/api/service/MsHashTreeService.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.ApiScenarioDTO; import io.metersphere.api.dto.datacount.ApiMethodUrlDTO; import io.metersphere.api.dto.definition.ApiDefinitionResult; @@ -77,7 +78,7 @@ public class MsHashTreeService { if (refType.equals(CASE)) { ApiTestCaseWithBLOBs bloBs = apiTestCaseService.get(object.getString(ID)); if (bloBs != null) { - object = JSON.parseObject(bloBs.getRequest()); + object = JSON.parseObject(bloBs.getRequest(), Feature.DisableSpecialKeyDetect); object.put(ID, bloBs.getId()); object.put(NAME, bloBs.getName()); hashTree.set(i, object); @@ -85,14 +86,14 @@ public class MsHashTreeService { } else { ApiScenarioWithBLOBs bloBs = apiScenarioMapper.selectByPrimaryKey(object.getString(ID)); if (bloBs != null) { - object = JSON.parseObject(bloBs.getScenarioDefinition()); + object = JSON.parseObject(bloBs.getScenarioDefinition(),Feature.DisableSpecialKeyDetect); hashTree.set(i, object); } } } else if (SCENARIO.equals(object.getString(TYPE))) { ApiScenarioWithBLOBs bloBs = apiScenarioMapper.selectByPrimaryKey(object.getString(ID)); if (bloBs != null) { - object = JSON.parseObject(bloBs.getScenarioDefinition()); + object = JSON.parseObject(bloBs.getScenarioDefinition(),Feature.DisableSpecialKeyDetect); hashTree.set(i, object); } } @@ -182,7 +183,7 @@ public class MsHashTreeService { ApiTestCaseInfo apiTestCase = apiTestCaseService.get(element.getString(ID)); if (apiTestCase != null) { if (StringUtils.equalsIgnoreCase(element.getString(REFERENCED), REF)) { - JSONObject refElement = JSON.parseObject(apiTestCase.getRequest()); + JSONObject refElement = JSON.parseObject(apiTestCase.getRequest(),Feature.DisableSpecialKeyDetect); ElementUtil.dataFormatting(refElement); JSONArray array = refElement.getJSONArray(HASH_TREE); ElementUtil.copyBean(element, refElement); @@ -255,7 +256,7 @@ public class MsHashTreeService { ? element.getBoolean(VARIABLE_ENABLE) : true; if (StringUtils.equalsIgnoreCase(element.getString(REFERENCED), REF)) { - element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition()); + element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition(),Feature.DisableSpecialKeyDetect); element.put(REFERENCED, REF); element.put(NAME, scenarioWithBLOBs.getName()); } diff --git a/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java b/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java index c28e9d93dc..dfaa2ee512 100644 --- a/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java +++ b/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java @@ -1,10 +1,10 @@ package io.metersphere.log.aspect; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.parser.Feature; import io.metersphere.base.domain.OperatingLogWithBLOBs; import io.metersphere.commons.utils.LogUtil; import io.metersphere.commons.utils.SessionUtils; -import io.metersphere.i18n.Translator; import io.metersphere.log.annotation.MsAuditLog; import io.metersphere.log.service.OperatingLogService; import io.metersphere.log.utils.ReflexObjectUtil; @@ -188,7 +188,7 @@ public class MsLogAspect { String content = expression.getValue(context, String.class); try { if (StringUtils.isNotEmpty(content)) { - OperatingLogDetails details = JSON.parseObject(content, OperatingLogDetails.class); + OperatingLogDetails details = JSON.parseObject(content, OperatingLogDetails.class, Feature.DisableSpecialKeyDetect); if (StringUtils.isNotEmpty(details.getProjectId())) { msOperLog.setProjectId(details.getProjectId()); } @@ -199,7 +199,7 @@ public class MsLogAspect { msOperLog.setCreateUser(details.getCreateUser()); } if (StringUtils.isNotEmpty(content) && StringUtils.isNotEmpty(msLog.beforeValue())) { - OperatingLogDetails details = JSON.parseObject(content, OperatingLogDetails.class); + OperatingLogDetails details = JSON.parseObject(content, OperatingLogDetails.class,Feature.DisableSpecialKeyDetect); List columns = ReflexObjectUtil.compared(JSON.parseObject(msLog.beforeValue(), OperatingLogDetails.class), details, msLog.module()); details.setColumns(columns); msOperLog.setOperContent(JSON.toJSONString(details));