diff --git a/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanCollection.java b/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanCollection.java index 636feab2325decd3df6081526f6a7100b532dfc3..4a932d5d8d24d1cafb3d8daf6ff2adfb99fb00f4 100644 --- a/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanCollection.java +++ b/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanCollection.java @@ -8,6 +8,6 @@ import java.util.List; public class PostmanCollection { private PostmanCollectionInfo info; - private List item; + private List variable; } diff --git a/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanItem.java b/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanItem.java index 4e6bc4c98757800eecb3264bba4e49187bfd0c19..49ccae955e58e1473b4fb14cdb47753d20448099 100644 --- a/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanItem.java +++ b/backend/src/main/java/io/metersphere/api/dto/parse/postman/PostmanItem.java @@ -2,9 +2,11 @@ package io.metersphere.api.dto.parse.postman; import lombok.Data; +import java.util.List; + @Data public class PostmanItem { - private String name; private PostmanRequest request; + private List item; } diff --git a/backend/src/main/java/io/metersphere/api/parse/PostmanParser.java b/backend/src/main/java/io/metersphere/api/parse/PostmanParser.java index 0df43b12e78a6ff42f97c76094aa707618093c2f..9edbba24356fe772b649842c409eb2f73bf000ba 100644 --- a/backend/src/main/java/io/metersphere/api/parse/PostmanParser.java +++ b/backend/src/main/java/io/metersphere/api/parse/PostmanParser.java @@ -15,10 +15,7 @@ import io.metersphere.commons.constants.PostmanRequestBodyMode; import org.apache.commons.lang3.StringUtils; import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class PostmanParser extends ApiImportAbstractParser { @@ -35,18 +32,20 @@ public class PostmanParser extends ApiImportAbstractParser { @Override public ApiImport parse(InputStream source, ApiTestImportRequest request) { + String testStr = getApiTestStr(source); PostmanCollection postmanCollection = JSON.parseObject(testStr, PostmanCollection.class); PostmanCollectionInfo info = postmanCollection.getInfo(); - List requests = parseRequests(postmanCollection); + List variables = postmanCollection.getVariable(); ApiImport apiImport = new ApiImport(); List scenarios = new ArrayList<>(); + Scenario scenario = new Scenario(); - scenario.setRequests(requests); scenario.setName(info.getName()); setScenarioByRequest(scenario, request); - scenarios.add(scenario); + parseItem(postmanCollection.getItem(), scenario, variables, scenarios); apiImport.setScenarios(scenarios); + return apiImport; } @@ -59,23 +58,42 @@ public class PostmanParser extends ApiImportAbstractParser { return keyValues; } - private List parseRequests(PostmanCollection postmanCollection) { - List item = postmanCollection.getItem(); + private void parseItem(List items, Scenario scenario, List variables, List scenarios) { List requests = new ArrayList<>(); - for (PostmanItem requestItem : item) { - HttpRequest request = new HttpRequest(); - PostmanRequest requestDesc = requestItem.getRequest(); - PostmanUrl url = requestDesc.getUrl(); - request.setName(requestItem.getName()); - request.setUrl(url.getRaw()); - request.setUseEnvironment(false); - request.setMethod(requestDesc.getMethod()); - request.setHeaders(parseKeyValue(requestDesc.getHeader())); - request.setParameters(parseKeyValue(url.getQuery())); - request.setBody(parseBody(requestDesc, request)); - requests.add(request); + for (PostmanItem item : items) { + List childItems = item.getItem(); + if (childItems != null) { + Scenario subScenario = new Scenario(); + subScenario.setName(item.getName()); + subScenario.setEnvironmentId(scenario.getEnvironmentId()); + parseItem(childItems, subScenario, variables, scenarios); + } else { + Request request = parseRequest(item); + if (request != null) { + requests.add(request); + } + } + } + scenario.setVariables(parseKeyValue(variables)); + scenario.setRequests(requests); + scenarios.add(scenario); + } + + private Request parseRequest(PostmanItem requestItem) { + HttpRequest request = new HttpRequest(); + PostmanRequest requestDesc = requestItem.getRequest(); + if (requestDesc == null) { + return null; } - return requests; + PostmanUrl url = requestDesc.getUrl(); + request.setName(requestItem.getName()); + request.setUrl(url.getRaw()); + request.setUseEnvironment(false); + request.setMethod(requestDesc.getMethod()); + request.setHeaders(parseKeyValue(requestDesc.getHeader())); + request.setParameters(parseKeyValue(url.getQuery())); + request.setBody(parseBody(requestDesc, request)); + return request; } private Body parseBody(PostmanRequest requestDesc, HttpRequest request) { @@ -88,8 +106,8 @@ public class PostmanParser extends ApiImportAbstractParser { if (StringUtils.equals(bodyMode, PostmanRequestBodyMode.RAW.value())) { body.setRaw(postmanBody.getString(bodyMode)); body.setType(MsRequestBodyType.RAW.value()); - String contentType = postmanBodyRowMap.get(postmanBody.getJSONObject("options").getJSONObject("raw").getString("language")); - addContentType(request, contentType); + String language = postmanBody.getJSONObject("options").getJSONObject(PostmanRequestBodyMode.RAW.value()).getString("language"); + body.setFormat(language); } else if (StringUtils.equals(bodyMode, PostmanRequestBodyMode.FORM_DATA.value()) || StringUtils.equals(bodyMode, PostmanRequestBodyMode.URLENCODED.value())) { List postmanKeyValues = JSON.parseArray(postmanBody.getString(bodyMode), PostmanKeyValue.class); body.setType(MsRequestBodyType.KV.value()); diff --git a/frontend/src/business/components/api/test/components/import/ApiImport.vue b/frontend/src/business/components/api/test/components/import/ApiImport.vue index 44aa5b07c4276d0856d92195d622b4fe7384a732..be6572e96aec542b8d6990784fccaf224cd20f8b 100644 --- a/frontend/src/business/components/api/test/components/import/ApiImport.vue +++ b/frontend/src/business/components/api/test/components/import/ApiImport.vue @@ -28,7 +28,7 @@ - + {{$t('api_test.environment.environment_config')}} @@ -39,7 +39,7 @@ - + {{$t('api_test.environment.config_environment')}}