diff --git a/frontend/src/models/apiTest/common.ts b/frontend/src/models/apiTest/common.ts index 9fb2442614..34a5a79e2b 100644 --- a/frontend/src/models/apiTest/common.ts +++ b/frontend/src/models/apiTest/common.ts @@ -468,6 +468,7 @@ export interface CurlParseResult { method: RequestMethods | string; url: string; headers: Record; - body: string; + body: Record; + bodyType: RequestBodyFormat; queryParams: Record; } diff --git a/frontend/src/views/api-test/components/utils.ts b/frontend/src/views/api-test/components/utils.ts index b7c3d5b91a..fb3a3e04c3 100644 --- a/frontend/src/views/api-test/components/utils.ts +++ b/frontend/src/views/api-test/components/utils.ts @@ -7,9 +7,10 @@ import { type ResponseDefinition, } from '@/models/apiTest/common'; import type { MockBody } from '@/models/apiTest/mock'; -import { RequestConditionProcessor, RequestParamsType } from '@/enums/apiEnum'; +import { RequestBodyFormat, RequestConditionProcessor, RequestParamsType } from '@/enums/apiEnum'; import { + defaultBodyParams, defaultBodyParamsItem, defaultHeaderParamsItem, defaultKeyValueParamItem, @@ -273,3 +274,47 @@ export function filterAssertions(assertionConfig: ExecuteAssertionConfig, isExec }; }); } + +/** + * 解析 curl 结果中的 body 参数 + * @param bodyType body 类型 + * @param body body 参数对象 + */ +export function parseCurlBody(bodyType: RequestBodyFormat, body: Record) { + const requestBody = cloneDeep(defaultBodyParams); + switch (bodyType) { + case RequestBodyFormat.JSON: + requestBody.bodyType = bodyType; + requestBody.jsonBody = { + ...cloneDeep(defaultBodyParams.jsonBody), + enableJsonSchema: false, + jsonValue: JSON.stringify(body), + }; + break; + case RequestBodyFormat.FORM_DATA: + requestBody.bodyType = bodyType; + requestBody.formDataBody = { + ...cloneDeep(defaultBodyParams.formDataBody), + formValues: Object.keys(body).map((e) => ({ + ...defaultBodyParamsItem, + key: e, + value: body[e], + })), + }; + break; + case RequestBodyFormat.WWW_FORM: + requestBody.bodyType = bodyType; + requestBody.wwwFormBody = { + ...cloneDeep(defaultBodyParams.wwwFormBody), + formValues: Object.keys(body).map((e) => ({ + ...defaultBodyParamsItem, + key: e, + value: body[e], + })), + }; + break; + default: + break; + } + return requestBody; +} diff --git a/frontend/src/views/api-test/debug/index.vue b/frontend/src/views/api-test/debug/index.vue index 82e73339f2..ce9b0ca38f 100644 --- a/frontend/src/views/api-test/debug/index.vue +++ b/frontend/src/views/api-test/debug/index.vue @@ -110,7 +110,7 @@ } from '@/enums/apiEnum'; import { defaultBodyParams, defaultResponse } from '../components/config'; - import { parseRequestBodyFiles } from '../components/utils'; + import { parseCurlBody, parseRequestBodyFiles } from '../components/utils'; const route = useRoute(); const { t } = useI18n(); @@ -250,7 +250,8 @@ } function handleImportCurlDone(res: CurlParseResult) { - const { url, method, headers, queryParams } = res; + const { url, method, headers, queryParams, bodyType, body } = res; + const requestBody = parseCurlBody(bodyType, body); addDebugTab({ url, method: method?.toUpperCase() || RequestMethods.GET, @@ -274,6 +275,7 @@ key: e, value: queryParams[e], })) || [], + body: requestBody, }); importDialogVisible.value = false; nextTick(() => { diff --git a/frontend/src/views/api-test/scenario/components/common/customApiDrawer.vue b/frontend/src/views/api-test/scenario/components/common/customApiDrawer.vue index a0d331ada1..f660c9aa80 100644 --- a/frontend/src/views/api-test/scenario/components/common/customApiDrawer.vue +++ b/frontend/src/views/api-test/scenario/components/common/customApiDrawer.vue @@ -418,6 +418,7 @@ filterAssertions, filterConditionsSqlValidParams, filterKeyValParams, + parseCurlBody, parseRequestBodyFiles, } from '@/views/api-test/components/utils'; import type { Api } from '@form-create/arco-design'; @@ -1282,7 +1283,8 @@ const importDialogVisible = ref(false); function handleImportCurlDone(res: CurlParseResult) { - const { url, method, headers, queryParams } = res; + const { url, method, headers, queryParams, bodyType, body } = res; + const requestBody = parseCurlBody(bodyType, body); requestVModel.value.url = url; requestVModel.value.method = method; requestVModel.value.headers = Object.keys(headers).map((e) => ({ @@ -1295,6 +1297,7 @@ key: e, value: queryParams[e], })); + requestVModel.value.body = requestBody; importDialogVisible.value = false; nextTick(() => { handleActiveDebugChange();