web-map/src/pages/API_MAP_CONVERTER_README.md

5.8 KiB
Raw Blame History

地图转换API接口使用说明

接口地址

POST /api/map-converter/process-json-list

请求格式

请求体应为一个JSON数组每个数组元素代表一个楼层的地图信息

[
  {
    "floors": 1,           // 楼层 (int, 必填, 不可重复)
    "type": "smap",        // 地图类型 (string, 必填, smap或scene)
    "placeholder1": "...",  // 地图文件内容 (string, 必填)
    "placeholder2": "...",  // 地图文件内容 (string, 选填)
    "OriginalProperties": "...."  // 原始地图内容 (string, 必填)
  }
]

字段说明

字段名 说明 类型 是否必填 其他要求
floors 楼层 int 必填 不可重复,必须连续
type 地图类型 string 必填 可填smap或scene在一层楼中placeholder有多个时type必须为smap
placeholder1 上传的地图文件内容 string 必填 在一层楼中placeholder所加载的地图类型必须与type一致
placeholder2 上传的地图文件内容 string 选填 在一层楼中placeholder所加载的地图类型必须与type一致
placeholderX 上传的地图文件内容 string 选填 在一层楼中placeholder所加载的地图类型必须与type一致
OriginalProperties 原始地图内容 string 必填 可以为空,用于保留原场景属性

请求验证规则

  1. 楼层验证

    • 楼层编号必须唯一且连续
    • 如果存在楼层1、2、4则缺少楼层3请求将被拒绝
  2. 机器人组验证

    • 同一机器人ID不能出现在不同组中包括跨楼层情况
    • 如果发现重复,将返回错误信息
  3. 地图类型验证

    • 当一层楼有多个placeholder时type必须为"smap"
    • 所有placeholder的内容类型必须与type一致

响应格式

成功响应可能有两种形式:

1. ZIP文件流响应主要响应形式

API处理成功后默认返回ZIP文件流包含处理后的地图文件

Content-Type: application/zip
Content-Disposition: attachment; filename=converted_map.zip

2. JSON格式响应仅在特定情况下

{
  "success": true,
  "message": "请求处理成功",
  "timestamp": "2023-05-15T10:30:45.123456",
  "data": {
    // 处理结果数据
  }
}

错误响应

{
  "success": false,
  "message": "错误描述",
  "timestamp": "2023-05-15T10:30:45.123456",
  "error": "详细错误信息"
}

处理逻辑

单楼层处理

  1. 单个placeholder

    • 如果type为"scene"且OriginalProperties有值将执行场景丰富化
    • 最终返回包含处理后scene文件的ZIP
  2. 多个placeholder

    • 如果type为"smap",将执行地图拼接
    • 最终返回包含拼接后scene文件的ZIP

多楼层处理

  1. 所有楼层必须连续
  2. 每个楼层按照单楼层逻辑处理
  3. 最终返回包含所有处理后文件的ZIP

使用示例

Python requests示例

import requests
import json

# 准备请求数据
data = [
    {
        "floors": 1,
        "type": "smap",
        "placeholder1": '{"version": "1.0", "mapData": "..."}',
        "OriginalProperties": ""
    }
]

# 发送请求
response = requests.post(
    "http://localhost:8000/api/map-converter/process-json-list",
    json=data
)

# 处理响应
if response.headers.get('content-type', '').startswith('application/json'):
    # JSON响应
    result = response.json()
    print(json.dumps(result, indent=2, ensure_ascii=False))
else:
    # ZIP文件流响应
    with open('result.zip', 'wb') as f:
        f.write(response.content)
    print("文件已保存为 result.zip")
    
    # 解压ZIP文件可选
    import zipfile
    import os
    
    output_dir = "outputmap"
    os.makedirs(output_dir, exist_ok=True)
    
    with zipfile.ZipFile('result.zip', 'r') as zip_ref:
        zip_ref.extractall(output_dir)
    print(f"ZIP文件已解压到 {output_dir} 目录")

cURL示例

curl -X POST "http://localhost:8000/api/map-converter/process-json-list" \
-H "Content-Type: application/json" \
-d '[
  {
    "floors": 1,
    "type": "scene",
    "placeholder1": "{\"version\": \"1.0\", \"mapData\": \"...\"}",
    "OriginalProperties": "{\"robotGroups\": [...]}"
  }
]' \
--output result.zip

启动服务

基本启动

cd d:\CodeProject\map-converter
python start_map_service.py

高级启动选项

# 指定主机和端口
python start_map_service.py --host 0.0.0.0 --port 8080

# 开发模式(启用热重载)
python start_map_service.py --reload

服务状态检查

# 检查服务是否运行
curl http://localhost:8000/

服务默认运行在 http://127.0.0.1:8000

测试工具

项目提供了模拟API请求的脚本可用于测试

python simulate_api_request.py

该脚本会:

  1. 检查服务状态
  2. 读取intput.json文件中的测试数据
  3. 发送API请求
  4. 处理并保存响应结果

注意事项

  1. 文件大小限制:大文件可能需要调整服务器配置
  2. 超时设置:复杂地图处理可能需要较长时间,建议设置适当的客户端超时
  3. 编码格式所有文本内容应使用UTF-8编码
  4. JSON格式确保所有JSON内容格式正确特别注意尾随逗号问题
  5. 临时文件:处理过程中会创建临时文件,系统会自动清理

错误排查

  1. 楼层不连续错误检查floors字段是否连续
  2. 机器人组重复错误检查OriginalProperties中的robotGroups配置
  3. 地图类型不匹配错误确保placeholder内容与type字段一致
  4. JSON解析错误验证所有JSON内容格式正确

日志查看

服务运行日志会输出到控制台,包含详细的处理信息和错误堆栈,可用于问题排查。