feat: mock配置迁移至JSON格式并修复body匹配

- 将mock配置从YAML格式迁移到JSON格式
- 修复JSON字符串格式body匹配失败问题
- 添加MCP功能模块
- 更新mock-spec.md规范文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-29 09:43:11 +08:00
parent 061ceff4b8
commit d364307131
42 changed files with 1509 additions and 893 deletions

View File

@@ -1,73 +0,0 @@
# 上传头像 - Multipart 格式(数组形式,只匹配字段名)
- name: "user_upload_avatar_001"
request:
method: "POST"
path: "/v1/user/avatar"
headers:
Content-Type: "multipart/form-data"
body:
- "avatar1"
- "description1"
response:
status: 200
headers:
Content-Type: "application/json"
body: |
{
"code": 0,
"message": "头像上传成功",
"data": {
"url": "https://cdn.example.com/v1/avatars/10001.jpg",
"size": 204800,
"filename": "avatar.jpg"
}
}
- name: "user_upload_avatar_002"
request:
method: "POST"
path: "/v1/user/avatar"
headers:
Content-Type: "multipart/form-data"
body:
avatar2: "avatar"
description2: "description"
response:
status: 200
headers:
Content-Type: "application/json"
body: |
{
"code": 0,
"message": "头像上传成功",
"data": {
"url": "https://cdn.example.com/v1/avatars/10002.jpg",
"size": 204800,
"filename": "avatar.jpg"
}
}
- name: "user_upload_avatar_003"
request:
method: "POST"
path: "/v1/user/avatar"
headers:
Content-Type: "multipart/form-data"
body: >
{
"avatar3": "avatar"
"description3": "description"
}
response:
status: 200
headers:
Content-Type: "application/json"
body: |
{
"code": 0,
"message": "头像上传成功",
"data": {
"url": "https://cdn.example.com/v1/avatars/10003.jpg",
"size": 204800,
"filename": "avatar.jpg"
}
}

View File

@@ -0,0 +1,18 @@
{
"name": "user_upload_avatar_001",
"request": {
"method": "POST",
"path": "/v1/user/avatar",
"headers": {
"Content-Type": "multipart/form-data"
},
"body": ["avatar1", "description1"]
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "{\"code\":0,\"message\":\"头像上传成功\",\"data\":{\"url\":\"https://cdn.example.com/v1/avatars/10001.jpg\",\"size\":204800,\"filename\":\"avatar.jpg\"}}"
}
}

View File

@@ -0,0 +1,21 @@
{
"name": "user_upload_avatar_002",
"request": {
"method": "POST",
"path": "/v1/user/avatar",
"headers": {
"Content-Type": "multipart/form-data"
},
"body": {
"avatar2": "avatar",
"description2": "description"
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "{\"code\":0,\"message\":\"头像上传成功\",\"data\":{\"url\":\"https://cdn.example.com/v1/avatars/10002.jpg\",\"size\":204800,\"filename\":\"avatar.jpg\"}}"
}
}

View File

@@ -0,0 +1,21 @@
{
"name": "user_upload_avatar_003",
"request": {
"method": "POST",
"path": "/v1/user/avatar",
"headers": {
"Content-Type": "multipart/form-data"
},
"body": {
"avatar3": "avatar",
"description3": "description"
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "{\"code\":0,\"message\":\"头像上传成功\",\"data\":{\"url\":\"https://cdn.example.com/v1/avatars/10003.jpg\",\"size\":204800,\"filename\":\"avatar.jpg\"}}"
}
}

View File

@@ -0,0 +1,18 @@
{
"name": "user_download",
"request": {
"method": "GET",
"path": "/v1/user/download",
"query_params": {
"format": "json"
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/octet-stream",
"Content-Disposition": "attachment; filename=user_data.json"
},
"body": "file://./storage/v1/user_data.json"
}
}

View File

@@ -1,13 +0,0 @@
# 下载用户数据文件 - file:// 协议
name: "user_download"
request:
method: "GET"
path: "/v1/user/download"
query_params:
format: "json"
response:
status: 200
headers:
Content-Type: "application/octet-stream"
Content-Disposition: "attachment; filename=user_data.json"
body: "file://./storage/v1/user_data.json"

18
mocks/v1/user/echo.json Normal file
View File

@@ -0,0 +1,18 @@
{
"name": "user_echo",
"request": {
"method": "POST",
"path": "/v1/user/echo",
"headers": {
"Content-Type": "text/plain"
},
"body": "Hello V1 Mock Server"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "text/plain"
},
"body": "Echo from V1: Hello V1 Mock Server"
}
}

View File

@@ -1,13 +0,0 @@
# 文本回显 - Text 格式
name: "user_echo"
request:
method: "POST"
path: "/v1/user/echo"
headers:
Content-Type: "text/plain"
body: "Hello V1 Mock Server"
response:
status: 200
headers:
Content-Type: "text/plain"
body: "Echo from V1: Hello V1 Mock Server"

View File

@@ -0,0 +1,21 @@
{
"name": "_user_login_form",
"request": {
"method": "POST",
"path": "/v1/user/login/form",
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
},
"body": {
"username": "formuser",
"password": "formpass"
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "{\"code\":0,\"message\":\"表单登录成功\",\"data\":{\"token\":\"v2_form_token_xyz\",\"userId\":20001,\"username\":\"formuser\"}}"
}
}

View File

@@ -1,24 +0,0 @@
# 表单登录 - Form 格式
name: "_user_login_form"
request:
method: "POST"
path: "/v1/user/login/form"
headers:
Content-Type: "application/x-www-form-urlencoded"
body:
username: "formuser"
password: "formpass"
response:
status: 200
headers:
Content-Type: "application/json"
body: |
{
"code": 0,
"message": "表单登录成功",
"data": {
"token": "v2_form_token_xyz",
"userId": 20001,
"username": "formuser"
}
}

View File

@@ -0,0 +1,17 @@
{
"name": "user_profile",
"request": {
"method": "GET",
"path": "/v1/user/profile",
"headers": {
"Authorization": "Bearer v1_test_token"
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": "{\"code\":0,\"message\":\"获取成功\",\"data\":{\"userId\":10001,\"username\":\"admin\",\"email\":\"admin@example.com\",\"nickname\":\"管理员\",\"avatar\":\"https://example.com/avatars/admin.jpg\",\"createdAt\":\"2025-01-01T00:00:00Z\"}}"
}
}

View File

@@ -1,24 +0,0 @@
# 获取用户信息 - GET 无 Body需要 Authorization Header
name: "user_profile"
request:
method: "GET"
path: "/v1/user/profile"
headers:
Authorization: "Bearer v1_test_token"
response:
status: 200
headers:
Content-Type: "application/json"
body: |
{
"code": 0,
"message": "获取成功",
"data": {
"userId": 10001,
"username": "admin",
"email": "admin@example.com",
"nickname": "管理员",
"avatar": "https://example.com/avatars/admin.jpg",
"createdAt": "2025-01-01T00:00:00Z"
}
}