diff --git a/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java b/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java index 8209e43732..91429201fe 100644 --- a/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java +++ b/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java @@ -16,10 +16,8 @@ import io.metersphere.jmeter.utils.ScriptEngineUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.jmeter.protocol.java.sampler.JSR223Sampler; -import org.apache.jmeter.samplers.SampleResult; -import javax.script.ScriptException; +import javax.script.ScriptEngine; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.util.*; @@ -300,7 +298,27 @@ public class MockApiUtils { return returnMap; } - public static String getResultByResponseResult(JSONObject bodyObj, String url, Map headerMap, RequestMockParams requestMockParams) { + public String getResultByResponseResult(JSONObject bodyObj, String url, Map headerMap, RequestMockParams requestMockParams, boolean useScript) { + MockScriptEngineUtils scriptEngineUtils = new MockScriptEngineUtils(); + ScriptEngine scriptEngine = null; + String scriptLanguage = "beanshell"; + String script = null; + if(useScript){ + if (bodyObj.containsKey("scriptObject")) { + try { + JSONObject scriptObj = bodyObj.getJSONObject("scriptObject"); + scriptLanguage = scriptObj.getString("scriptLanguage"); + script = scriptObj.getString("script"); + } catch (Exception e) { + LogUtil.error(e); + } + } + } + scriptEngine = scriptEngineUtils.getBaseScriptEngine(scriptLanguage,url,headerMap,requestMockParams); + if(StringUtils.isNotEmpty(script) && scriptEngine != null){ + scriptEngineUtils.runScript(scriptEngine,script); + } + if (headerMap == null) { headerMap = new HashMap<>(); } @@ -357,94 +375,13 @@ public class MockApiUtils { String raw = bodyObj.getString("apiRspRaw"); returnStr = raw; } - } else if (StringUtils.equalsAnyIgnoreCase(type, "script")) { - if (bodyObj.containsKey("scriptObject")) { - JSONObject scriptObj = bodyObj.getJSONObject("scriptObject"); - String script = scriptObj.getString("script"); - String scriptLanguage = scriptObj.getString("scriptLanguage"); - - String baseScript = parseScript(url, headerMap, requestMockParams); - try { - script = baseScript + script; - if (StringUtils.isEmpty(scriptLanguage)) { - scriptLanguage = "beanshell"; - } - returnStr = runScript(script, scriptLanguage); - } catch (Exception e) { - LogUtil.error(e); - } - } } - } + returnStr = scriptEngineUtils.parseReportString(scriptEngine,returnStr); return returnStr; } } - private static String parseScript(String url, Map headerMap, RequestMockParams requestMockParams) { - StringBuffer scriptStringBuffer = new StringBuffer(); - scriptStringBuffer.append("import java.util.HashMap;\n\n"); - scriptStringBuffer.append("HashMap requestParams = new HashMap();\n"); - scriptStringBuffer.append("requestParams.put(\"address\",\"" + url + "\");\n"); - //写入请求头 - for (Map.Entry headEntry : headerMap.entrySet()) { - String headerKey = headEntry.getKey(); - String headerValue = headEntry.getValue(); - scriptStringBuffer.append("requestParams.put(\"header." + headerKey + "\",\"" + headerValue + "\");\n"); - } - //写入body参数 - if (requestMockParams.getBodyParams() != null) { - if (requestMockParams.getBodyParams().size() == 1) { - //参数是jsonObject - JSONObject bodyParamObj = requestMockParams.getBodyParams().getJSONObject(0); - for (String key : bodyParamObj.keySet()) { - String value = String.valueOf(bodyParamObj.get(key)); - value = StringUtils.replace(value, "\\", "\\\\"); - value = StringUtils.replace(value, "\"", "\\\""); - scriptStringBuffer.append("requestParams.put(\"body." + key + "\",\"" + value + "\");\n"); - if (StringUtils.equalsIgnoreCase(key, "raw")) { - scriptStringBuffer.append("requestParams.put(\"bodyRaw\",\"" + value + "\");\n"); - } - } - String jsonBody = bodyParamObj.toJSONString(); - jsonBody = StringUtils.replace(jsonBody, "\\", "\\\\"); - jsonBody = StringUtils.replace(jsonBody, "\"", "\\\""); - scriptStringBuffer.append("requestParams.put(\"body.json\",\"" + jsonBody + "\");\n"); - } else { - scriptStringBuffer.append("requestParams.put(\"bodyRaw\",\"" + requestMockParams.getBodyParams().toJSONString() + "\");\n"); - } - - } - //写入query参数 - if (requestMockParams.getQueryParamsObj() != null) { - JSONObject queryParamsObj = requestMockParams.getQueryParamsObj(); - for (String key : queryParamsObj.keySet()) { - String value = String.valueOf(queryParamsObj.get(key)); - value = StringUtils.replace(value, "\\", "\\\\"); - value = StringUtils.replace(value, "\"", "\\\""); - scriptStringBuffer.append("requestParams.put(\"query." + key + "\",\"" + value + "\");\n"); - } - } - //写入rest参数 - if (requestMockParams.getRestParamsObj() != null) { - JSONObject restParamsObj = requestMockParams.getRestParamsObj(); - for (String key : restParamsObj.keySet()) { - String value = String.valueOf(restParamsObj.get(key)); - scriptStringBuffer.append("requestParams.put(\"rest." + key + "\",\"" + value + "\");\n"); - } - } - return scriptStringBuffer.toString(); - } - - private static String runScript(String script, String scriptLanguage) throws ScriptException { - JSR223Sampler jmeterScriptSampler = new JSR223Sampler(); - jmeterScriptSampler.setScriptLanguage(scriptLanguage); - jmeterScriptSampler.setScript(script); - SampleResult result = jmeterScriptSampler.sample(null); - return result.getResponseDataAsString(); - - } - public static RequestMockParams getParams(String urlParams, String apiPath, JSONObject queryParamsObject, JSON paramJson, boolean isPostRequest) { RequestMockParams returnParams = getGetParamMap(urlParams, apiPath, queryParamsObject, isPostRequest); if (paramJson != null) { @@ -719,6 +656,8 @@ public class MockApiUtils { } } } + }else { + return true; } return false; } diff --git a/backend/src/main/java/io/metersphere/api/mock/utils/MockScriptEngineUtils.java b/backend/src/main/java/io/metersphere/api/mock/utils/MockScriptEngineUtils.java new file mode 100644 index 0000000000..764521e85e --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/mock/utils/MockScriptEngineUtils.java @@ -0,0 +1,211 @@ +package io.metersphere.api.mock.utils; + +import com.alibaba.fastjson.JSONObject; +import io.metersphere.api.dto.mock.RequestMockParams; +import io.metersphere.commons.utils.LogUtil; +import org.apache.commons.lang3.StringUtils; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MockScriptEngineUtils { + + public JSONObject getVars(ScriptEngine engine){ + try { + return JSONObject.parseObject(JSONObject.toJSONString(engine.get("vars"))); + }catch (Exception e){ + LogUtil.error(e); + } + return new JSONObject(); + } + + public String get(ScriptEngine engine, String key){ + return String.valueOf(engine.get(key)); + } + + public void runScript(ScriptEngine engine, String script){ + try { + engine.eval(script); + }catch (Exception e){ + LogUtil.error(e); + } + } + + public ScriptEngine getBaseScriptEngine(String scriptLanguage, String url, Map headerMap, RequestMockParams requestMockParams){ + ScriptEngine engine = null; + try { + if (StringUtils.isEmpty(scriptLanguage)) { + return null; + } + if (StringUtils.equalsIgnoreCase(scriptLanguage, "beanshell")) { + ScriptEngineManager scriptEngineFactory = new ScriptEngineManager(); + engine = scriptEngineFactory.getEngineByName(scriptLanguage); + String preScript = this.genBeanshellPreScript(url, headerMap, requestMockParams); + engine.eval(preScript); + } else if (StringUtils.equalsIgnoreCase(scriptLanguage, "python")) { + ScriptEngineManager scriptEngineFactory = new ScriptEngineManager(); + engine = scriptEngineFactory.getEngineByName(scriptLanguage); + String preScript = this.genPythonPreScript(url, headerMap, requestMockParams); + engine.eval(preScript); + } + }catch (Exception e){ + LogUtil.error(e); + } + return engine; + } + + private String genBeanshellPreScript(String url, Map headerMap, RequestMockParams requestMockParams) { + StringBuffer preScriptBuffer = new StringBuffer(); + preScriptBuffer.append("Map vars = new HashMap();\n"); + preScriptBuffer.append("vars.put(\"address\",\"" + url + "\");\n"); + //写入请求头 + for (Map.Entry headEntry : headerMap.entrySet()) { + String headerKey = headEntry.getKey(); + String headerValue = headEntry.getValue(); + preScriptBuffer.append("vars.put(\"header." + headerKey + "\",\"" + headerValue + "\");\n"); + } + //写入body参数 + if (requestMockParams.getBodyParams() != null) { + if (requestMockParams.getBodyParams().size() == 1) { + //参数是jsonObject + JSONObject bodyParamObj = requestMockParams.getBodyParams().getJSONObject(0); + for (String key : bodyParamObj.keySet()) { + String value = String.valueOf(bodyParamObj.get(key)); + value = StringUtils.replace(value, "\\", "\\\\"); + value = StringUtils.replace(value, "\"", "\\\""); + preScriptBuffer.append("vars.put(\"body." + key + "\",\"" + value + "\");\n"); + if (StringUtils.equalsIgnoreCase(key, "raw")) { + preScriptBuffer.append("vars.put(\"bodyRaw\",\"" + value + "\");\n"); + } + } + String jsonBody = bodyParamObj.toJSONString(); + jsonBody = StringUtils.replace(jsonBody, "\\", "\\\\"); + jsonBody = StringUtils.replace(jsonBody, "\"", "\\\""); + preScriptBuffer.append("vars.put(\"body.json\",\"" + jsonBody + "\");\n"); + } else { + preScriptBuffer.append("vars.put(\"bodyRaw\",\"" + requestMockParams.getBodyParams().toJSONString() + "\");\n"); + } + + } + //写入query参数 + if (requestMockParams.getQueryParamsObj() != null) { + JSONObject queryParamsObj = requestMockParams.getQueryParamsObj(); + for (String key : queryParamsObj.keySet()) { + String value = String.valueOf(queryParamsObj.get(key)); + value = StringUtils.replace(value, "\\", "\\\\"); + value = StringUtils.replace(value, "\"", "\\\""); + preScriptBuffer.append("vars.put(\"query." + key + "\",\"" + value + "\");\n"); + } + } + //写入rest参数 + if (requestMockParams.getRestParamsObj() != null) { + JSONObject restParamsObj = requestMockParams.getRestParamsObj(); + for (String key : restParamsObj.keySet()) { + String value = String.valueOf(restParamsObj.get(key)); + preScriptBuffer.append("vars.put(\"rest." + key + "\",\"" + value + "\");\n"); + } + } + return preScriptBuffer.toString(); + } + + private String genPythonPreScript(String url, Map headerMap, RequestMockParams requestMockParams) { + StringBuffer preScriptBuffer = new StringBuffer(); + preScriptBuffer.append("vars = {}; \n"); + preScriptBuffer.append("vars[\"address\"]=\"" + url + "\";\n"); + //写入请求头 + for (Map.Entry headEntry : headerMap.entrySet()) { + String headerKey = headEntry.getKey(); + String headerValue = headEntry.getValue(); + preScriptBuffer.append("vars[\"header." + headerKey + "\"]=\"" + headerValue + "\";\n"); + } + //写入body参数 + if (requestMockParams.getBodyParams() != null) { + if (requestMockParams.getBodyParams().size() == 1) { + //参数是jsonObject + JSONObject bodyParamObj = requestMockParams.getBodyParams().getJSONObject(0); + for (String key : bodyParamObj.keySet()) { + String value = String.valueOf(bodyParamObj.get(key)); + value = StringUtils.replace(value, "\\", "\\\\"); + value = StringUtils.replace(value, "\"", "\\\""); + preScriptBuffer.append("vars[\"body." + key + "\"]=\"" + value + "\";\n"); + if (StringUtils.equalsIgnoreCase(key, "raw")) { + preScriptBuffer.append("vars[\"bodyRaw\"]=\"" + value + "\";\n"); + } + } + String jsonBody = bodyParamObj.toJSONString(); + jsonBody = StringUtils.replace(jsonBody, "\\", "\\\\"); + jsonBody = StringUtils.replace(jsonBody, "\"", "\\\""); + preScriptBuffer.append("vars[\"body.json\"]=\"" + jsonBody + "\";\n"); + } else { + preScriptBuffer.append("vars[\"bodyRaw\"]=\"" + requestMockParams.getBodyParams().toJSONString() + "\";\n"); + } + + } + //写入query参数 + if (requestMockParams.getQueryParamsObj() != null) { + JSONObject queryParamsObj = requestMockParams.getQueryParamsObj(); + for (String key : queryParamsObj.keySet()) { + String value = String.valueOf(queryParamsObj.get(key)); + value = StringUtils.replace(value, "\\", "\\\\"); + value = StringUtils.replace(value, "\"", "\\\""); + preScriptBuffer.append("vars[\"query." + key + "\"]=\"" + value + "\";\n"); + } + } + //写入rest参数 + if (requestMockParams.getRestParamsObj() != null) { + JSONObject restParamsObj = requestMockParams.getRestParamsObj(); + for (String key : restParamsObj.keySet()) { + String value = String.valueOf(restParamsObj.get(key)); + preScriptBuffer.append("vars[\"rest." + key + "\"]=\"" + value + "\";\n"); + } + } + return preScriptBuffer.toString(); + } + + public String parseReportString(ScriptEngine scriptEngine, String reportString) { + String regStr = "\\$\\{([^${}]+)\\}"; + Pattern pattern = Pattern.compile(regStr); + Matcher matcher = pattern.matcher(reportString); + List paramKeys = new ArrayList<>(); + while (matcher.find()){ + String paramKey = matcher.group(0); + if(!paramKeys.contains(paramKey)){ + paramKeys.add(paramKey); + } + } + JSONObject varsObject = this.getVars(scriptEngine); + for (String paramKey : paramKeys) { + String value = this.getValue(scriptEngine,varsObject,paramKey); + reportString = StringUtils.replace(reportString,paramKey,value); + } + return reportString; + } + + private String getValue(ScriptEngine scriptEngine, JSONObject varsObject, String paramKey) { + String key = paramKey; + if(key.startsWith("${") && key.endsWith("}")){ + key = paramKey.substring(2,key.length()-1); + } + String value = null; + if(varsObject != null && varsObject.containsKey(key)){ + value = varsObject.getString(key); + } + if(StringUtils.isEmpty(value)){ + try { + value = JSONObject.toJSONString(scriptEngine.get(key)); + }catch (Exception e){ + LogUtil.error(e); + } + } + if(StringUtils.isEmpty(value)){ + value = paramKey; + } + return value; + } + +} diff --git a/backend/src/main/java/io/metersphere/api/service/MockConfigService.java b/backend/src/main/java/io/metersphere/api/service/MockConfigService.java index c3af12269e..3d2ea27d3f 100644 --- a/backend/src/main/java/io/metersphere/api/service/MockConfigService.java +++ b/backend/src/main/java/io/metersphere/api/service/MockConfigService.java @@ -724,7 +724,12 @@ public class MockConfigService { } } if (responseJsonObj.containsKey("body")) { - returnStr = MockApiUtils.getResultByResponseResult(responseJsonObj.getJSONObject("body"), url, headerMap, requestMockParams); + MockApiUtils mockApiUtils = new MockApiUtils(); + boolean useScript = false; + if(responseJsonObj.containsKey("usePostScript")){ + useScript = responseJsonObj.getBoolean("usePostScript"); + } + returnStr = mockApiUtils.getResultByResponseResult(responseJsonObj.getJSONObject("body"), url, headerMap, requestMockParams,useScript); } if (responseJsonObj.containsKey("httpCode")) { int httpCodeNum = 500; @@ -1262,7 +1267,7 @@ public class MockConfigService { List tcpDataList = JSONArray.parseArray(requestJson.getString("xmlDataStruct"), TcpTreeTableDataStruct.class); xmlStr = TcpTreeTableDataParser.treeTableData2Xml(tcpDataList); } catch (Exception e) { - + LogUtil.error(e); } JSONObject matchObj = XMLUtils.XmlToJson(xmlStr); isMatch = JsonStructUtils.checkJsonObjCompliance(sourceObj, matchObj); diff --git a/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java index 156a478256..913c188693 100644 --- a/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java +++ b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServer.java @@ -21,7 +21,6 @@ public class TCPServer implements Runnable { public void openSocket() throws Exception { this.serverSocket = new ServerSocket(this.port); - int connectIndex = 0; while (true) { if (!this.serverSocket.isClosed()) { diff --git a/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java index 2852e90d9d..d77192dc6b 100644 --- a/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java +++ b/backend/src/main/java/io/metersphere/api/tcp/server/TCPServicer.java @@ -57,7 +57,12 @@ public class TCPServicer { if(responseObj.containsKey("responseResult")){ JSONObject respResultObj = responseObj.getJSONObject("responseResult"); if(respResultObj.containsKey("body")){ - returnMsg = MockApiUtils.getResultByResponseResult(respResultObj.getJSONObject("body"),"",null,null); + MockApiUtils mockApiUtils = new MockApiUtils(); + boolean useScript = false; + if(respResultObj.containsKey("usePostScript")){ + useScript = responseObj.getBoolean("usePostScript"); + } + returnMsg = mockApiUtils.getResultByResponseResult(respResultObj.getJSONObject("body"),"",null,null,useScript); } try { if(respResultObj.containsKey("delayed")){ @@ -70,7 +75,6 @@ public class TCPServicer { returnMsg = responseObj.getString("body"); } - try { Thread.sleep(delayed); } catch (Exception e) { diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanTestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanTestCaseService.java index dae197df16..4eae8ed35a 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanTestCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanTestCaseService.java @@ -224,8 +224,8 @@ public class TestPlanTestCaseService { * @param testId 接口测试id */ public void updateTestCaseStates(String testId, String testName, String planId, String testType) { - TestPlan testPlan = testPlanService.getTestPlan(planId); - if (BooleanUtils.isNotTrue(testPlan.getAutomaticStatusUpdate())) { + TestPlan testPlan1 = testPlanService.getTestPlan(planId); + if (BooleanUtils.isNotTrue(testPlan1.getAutomaticStatusUpdate())) { return; } TestCaseTestExample example = new TestCaseTestExample(); diff --git a/frontend/src/business/components/api/definition/components/mock/Components/MockApiResponseBody.vue b/frontend/src/business/components/api/definition/components/mock/Components/MockApiResponseBody.vue index 52f877cf08..159d1ef608 100644 --- a/frontend/src/business/components/api/definition/components/mock/Components/MockApiResponseBody.vue +++ b/frontend/src/business/components/api/definition/components/mock/Components/MockApiResponseBody.vue @@ -13,63 +13,55 @@ {{ $t('api_test.definition.request.body_raw') }} - - {{ $t('api_test.automation.customize_script') }} -
+ v-if="body.format==='JSON-SCHEMA'" + :body="body" + ref="jsonCodeEdit"/> + v-else-if="codeEditActive && loadIsOver" + :read-only="isReadOnly" + :data.sync="body.raw" + :modes="modes" + :mode="'json'" + height="90%" + ref="codeEdit"/>
+ :read-only="true" + :data.sync="body.apiRspRaw" + :modes="modes" + :mode="'text'" + v-if="loadIsOver" + height="90%" + ref="fromApiCodeEdit"/>
+ :read-only="isReadOnly" + :data.sync="body.xmlRaw" + :modes="modes" + :mode="'xml'" + v-if="loadIsOver" + height="90%" + ref="codeEdit"/>
-
- -
- + :read-only="isReadOnly" + :data.sync="body.raw" + :modes="modes" + height="90%" + ref="codeEdit"/>
@@ -86,7 +78,6 @@ import MsApiVariable from "@/business/components/api/definition/components/ApiVa import MsApiFromUrlVariable from "@/business/components/api/definition/components/body/ApiFromUrlVariable"; import BatchAddParameter from "@/business/components/api/definition/components/basis/BatchAddParameter"; import Convert from "@/business/components/common/json-schema/convert/convert"; -import MockApiScriptEditor from "@/business/components/api/definition/components/mock/Components/MockApiScriptEditor"; export default { name: "MockApiResponseBody", @@ -98,10 +89,9 @@ export default { MsApiFromUrlVariable, MsJsonCodeEdit, BatchAddParameter, - MockApiScriptEditor }, props: { - apiId:String, + apiId: String, body: {}, headers: Array, isReadOnly: { @@ -111,7 +101,11 @@ export default { isShowEnable: { type: Boolean, default: true - } + }, + usePostScript: { + type: Boolean, + default: false + }, }, data() { return { @@ -239,33 +233,30 @@ export default { modeChange(mode) { switch (this.body.type) { case "JSON": - // this.setContentType("application/json"); this.refreshMsCodeEdit(); break; case "XML": - // this.setContentType("text/xml"); this.refreshMsCodeEdit(); break; case "fromApi": this.selectApiResponse(); break; default: - // this.removeContentType(); this.refreshMsCodeEdit(); break; } }, - refreshMsCodeEdit(){ + refreshMsCodeEdit() { this.loadIsOver = false; this.$nextTick(() => { this.loadIsOver = true; }); }, - selectApiResponse(){ + selectApiResponse() { let selectUrl = "/mockConfig/getApiResponse/" + this.apiId; this.$get(selectUrl, response => { let apiResponse = response.data; - if(apiResponse && apiResponse.returnMsg){ + if (apiResponse && apiResponse.returnMsg) { this.body.apiRspRaw = apiResponse.returnMsg; } this.refreshMsCodeEdit(); @@ -317,8 +308,8 @@ export default { let keyValues = []; params.forEach(item => { let line = []; - line[0] = item.substring(0,item.indexOf(":")); - line[1] = item.substring(item.indexOf(":")+1,item.length); + line[0] = item.substring(0, item.indexOf(":")); + line[1] = item.substring(item.indexOf(":") + 1, item.length); let required = false; keyValues.unshift(new KeyValue({ name: line[0], diff --git a/frontend/src/business/components/api/definition/components/mock/Components/MockApiScriptEditor.vue b/frontend/src/business/components/api/definition/components/mock/Components/MockApiScriptEditor.vue index 10b96cb153..22f0f046e4 100644 --- a/frontend/src/business/components/api/definition/components/mock/Components/MockApiScriptEditor.vue +++ b/frontend/src/business/components/api/definition/components/mock/Components/MockApiScriptEditor.vue @@ -2,10 +2,10 @@
-
@@ -16,10 +16,12 @@
- - + @@ -38,60 +40,7 @@ export default { components: {MsDropdown, MsCodeEdit, CustomFunctionRelate, ApiFuncRelevance, MockScriptNavMenu}, data() { return { - jsr223ProcessorData: {}, baseCodeTemplates: [], - httpCodeTemplates: [ - { - title: "API"+this.$t('api_test.definition.document.request_info'), - children: [ - { - title: this.$t('api_test.request.address'), - value: 'var returnMsg = requestParams.get("address");\nreturn returnMsg;', - }, - { - title: "Header "+this.$t('api_test.definition.document.request_param'), - value: 'var returnMsg = requestParams.get("header.${param}");\nreturn returnMsg;', - }, - { - title: this.$t('api_test.request.body')+this.$t('api_test.variable'), - value: 'var returnMsg = requestParams.get("body.${param}");\nreturn returnMsg;\n' + - "\n"+ - '//如果对象是多层JSON,需要引入fastjson协助解析:\n' + - '// 以"{\"name\":\"user\",\"rows\":[{\"type\":1}]}" 为demo,取rows第1个的type数据:\n' + - 'import com.alibaba.fastjson.JSON;\n'+ - 'import com.alibaba.fastjson.JSONArray;\n'+ - 'import com.alibaba.fastjson.JSONObject;\n'+ - '\n'+ - 'var jsonParam = requestParams.get("body.json");\n' + - 'JSONObject jsonObject = JSONObject.parseObject(jsonParam);\n' + - 'var returnMsg = jsonObject.getJSONArray("rows").getJSONObject(0).getString("type");\n' + - 'return returnMsg;\n', - }, - { - title: this.$t('api_test.request.body')+this.$t('api_test.variable')+" (Raw)", - value: 'var returnMsg = requestParams.get("bodyRaw");\nreturn returnMsg;', - }, - { - title: "Query "+this.$t('api_test.definition.document.request_param'), - value: 'var returnMsg = requestParams.get("query.${param}");\nreturn returnMsg;', - }, - { - title: "Rest "+this.$t('api_test.definition.document.request_param'), - value: 'var returnMsg = requestParams.get("rest.${param}");\nreturn returnMsg;', - }, - - ] - }, - { - title: this.$t('project.code_segment.code_segment'), - children: [ - { - title: this.$t('project.code_segment.insert_segment'), - command: "custom_function", - } - ] - }, - ], tcpCodeTemplates: [ { title: this.$t('project.code_segment.code_segment'), @@ -105,8 +54,7 @@ export default { ], isCodeEditAlive: true, languages: [ - 'beanshell' - // , "python", "nashornScript", "rhinoScript" + 'beanshell', "python" ], codeEditModeMap: { beanshell: 'java', @@ -121,13 +69,62 @@ export default { } }, created() { - this.jsr223ProcessorData = this.jsr223Processor; - if(this.showApi){ + if (!this.jsr223Processor.scriptLanguage) { + this.jsr223Processor.scriptLanguage = "beanshell"; + } + if (this.showApi) { this.baseCodeTemplates = this.httpCodeTemplates; - }else { + } else { this.baseCodeTemplates = this.tcpCodeTemplates; } }, + + computed: { + httpCodeTemplates(){ + let returnData = [ + { + title: "API" + this.$t('api_test.definition.document.request_info'), + children: [ + { + title: this.$t('api_test.request.address'), + value: this.getScript("address"), + }, + { + title: "Header " + this.$t('api_test.definition.document.request_param'), + value: this.getScript("header"), + }, + { + title: this.$t('api_test.request.body') + this.$t('api_test.variable'), + value: this.getScript("body"), + }, + { + title: this.$t('api_test.request.body') + this.$t('api_test.variable') + " (Raw)", + value: this.getScript("bodyRaw"), + }, + { + title: "Query " + this.$t('api_test.definition.document.request_param'), + value: this.getScript("query"), + }, + { + title: "Rest " + this.$t('api_test.definition.document.request_param'), + value: this.getScript("rest"), + }, + + ] + }, + { + title: this.$t('project.code_segment.code_segment'), + children: [ + { + title: this.$t('project.code_segment.insert_segment'), + command: "custom_function", + } + ] + }, + ]; + return returnData; + } + }, props: { isReadOnly: { type: Boolean, @@ -137,26 +134,99 @@ export default { jsr223Processor: { type: Object, }, - showApi:{ - type:Boolean, - default:true, + showApi: { + type: Boolean, + default: true, }, node: {}, }, watch: { jsr223Processor() { this.reload(); + }, + 'jsr223Processor.scriptLanguage'(){ + if (this.showApi) { + this.baseCodeTemplates = this.httpCodeTemplates; + } else { + this.baseCodeTemplates = this.tcpCodeTemplates; + } + alert(JSON.stringify(this.baseCodeTemplates)); } } , methods: { - addTemplate(template) { - if (!this.jsr223ProcessorData.script) { - this.jsr223ProcessorData.script = ""; + getScript(type) { + let returnScript = ""; + let laguanges = "beanshell"; + if (this.jsr223Processor) { + laguanges = this.jsr223Processor.scriptLanguage } - this.jsr223ProcessorData.script += template.value; - if (this.jsr223ProcessorData.scriptLanguage === 'beanshell') { - this.jsr223ProcessorData.script += ';'; + switch (type) { + case "address": + if (laguanges === "python") { + returnScript = 'param=vars["address"]'; + } else { + returnScript = 'var param=vars.get("address")'; + } + break; + case "header": + if (laguanges === "python") { + returnScript = 'param=vars["header.${param}"]'; + } else { + returnScript = 'var param=vars.get("header.${param}")'; + } + break; + case "body": + if (laguanges === "python") { + returnScript = 'param=vars["body.${param}"]'; + } else { + returnScript = 'var param=vars.get(body.${param}")\n' + + '//如果对象是多层JSON,需要引入fastjson协助解析:\n' + + '// 以"{\"name\":\"user\",\"rows\":[{\"type\":1}]}" 为demo,取rows第1个的type数据:\n' + + 'import com.alibaba.fastjson.JSON;\n' + + 'import com.alibaba.fastjson.JSONArray;\n' + + 'import com.alibaba.fastjson.JSONObject;\n' + + '\n' + + 'var jsonParam = vars.get("body.json");\n' + + 'JSONObject jsonObject = JSONObject.parseObject(jsonParam);\n' + + 'var value = jsonObject.getJSONArray("rows").getJSONObject(0).getString("type");\n' + + 'vars.put("key1","value");\n'; + } + break; + case "bodyRaw": + if (laguanges === "python") { + returnScript = 'param=vars["bodyRaw"]'; + } else { + returnScript = 'var param=vars.get("bodyRaw")'; + } + break; + case "query": + if (laguanges === "python") { + returnScript = 'param=vars["query.${param}"]'; + } else { + returnScript = 'var param=vars.get("query.${param}")'; + } + break; + case "rest": + if (laguanges === "python") { + returnScript = 'param=vars["rest.${param}"]'; + } else { + returnScript = 'var param=vars.get("rest.${param}")'; + } + break; + default: + break; + } + + return returnScript; + }, + addTemplate(template) { + if (!this.jsr223Processor.script) { + this.jsr223Processor.script = ""; + } + this.jsr223Processor.script += template.value; + if (this.jsr223Processor.scriptLanguage === 'beanshell') { + this.jsr223Processor.script += ';'; } this.reload(); }, @@ -165,12 +235,12 @@ export default { this.$nextTick(() => (this.isCodeEditAlive = true)); }, languageChange(language) { - this.jsr223ProcessorData.scriptLanguage = language; + this.jsr223Processor.scriptLanguage = language; this.$emit("languageChange"); }, addCustomFuncScript(script) { - this.jsr223ProcessorData.script = this.jsr223ProcessorData.script ? - this.jsr223ProcessorData.script + '\n\n' + script : script; + this.jsr223Processor.script = this.jsr223Processor.script ? + this.jsr223Processor.script + '\n\n' + script : script; this.reload(); }, switchMenu() { @@ -184,10 +254,10 @@ export default { } }, handleCodeTemplate(code) { - if (!this.jsr223ProcessorData.script) { - this.jsr223ProcessorData.script = code; + if (!this.jsr223Processor.script) { + this.jsr223Processor.script = code; } else { - this.jsr223ProcessorData.script = this.jsr223ProcessorData.script + '\n' + code; + this.jsr223Processor.script = this.jsr223Processor.script + '\n' + code; } this.reload(); }, @@ -230,14 +300,15 @@ export default { } .show-menu { - text-align:center; + text-align: center; font-weight: bold; - color:#935aa1; + color: #935aa1; font-size: 18px; cursor: pointer; } + .show-menu:hover { - color:#935aa1; + color: #935aa1; } diff --git a/frontend/src/business/components/api/definition/components/mock/Components/MockApiVariable.vue b/frontend/src/business/components/api/definition/components/mock/Components/MockApiVariable.vue index 48c3991917..e8535836ae 100644 --- a/frontend/src/business/components/api/definition/components/mock/Components/MockApiVariable.vue +++ b/frontend/src/business/components/api/definition/components/mock/Components/MockApiVariable.vue @@ -47,7 +47,19 @@ - + + + diff --git a/frontend/src/business/components/api/definition/components/mock/Components/MockResponseParam.vue b/frontend/src/business/components/api/definition/components/mock/Components/MockResponseParam.vue index 9528773077..2b53ef10e7 100644 --- a/frontend/src/business/components/api/definition/components/mock/Components/MockResponseParam.vue +++ b/frontend/src/business/components/api/definition/components/mock/Components/MockResponseParam.vue @@ -1,35 +1,56 @@ - - - - -

{{ $t('api_test.mock.request_condition') }}

- +
+ +

{{ $t('api_test.mock.request_condition') }}

+ -
-
- - - - +
+
+ + + + - + +

{{ $t('api_test.mock.rsp_param') }}

-
- - - -
+ + + +{{$t('api_test.definition.request.post_script')}} + + + + +
- - - +
+ +