跳到主要内容

服务能力与错误处理

9 服务能力接口​

9.1 查询服务说明和调用限制​

GET /capabilities

无请求体。查询服务支持的运行模式及调用限制。apiVersion 为协议标识字符串,simulationTimeUnit 为仿真时间单位,us 表示微秒。runModes 数组给出各模式的最小与最大倍速,以及是否要求有限结束时刻。

limits 中 maximumPageSize、maximumEntityNames、maximumStatisticProperties 分别为页大小、单次对象名称数和统计属性数上限;maximumResponseBytes 为响应字节上限,resultRetentionMinutes 为终态运行数据保留分钟数。限制值应从服务响应读取,不能固定使用示例数值。调用频率与并发实例额度由服务提供方提供;HTTP 429 时按 Retry-After 响应头等待。

animation 中 animationTypes 给出动作类型,simulationTimeUnit=us 表示动作时刻采用仿真微秒,durationUnit=s 表示动作时长采用仿真秒,rotationRepresentation=EULER_XYZ_DEGREES 表示旋转采用以度计量的 XYZ 欧拉角,clockIncludedInResponses 表示响应附带时钟。实体的 supportedActions 给出实际适用动作,具体结构见第 7 章。

scripts 中 sourceTypes 和 language 给出脚本来源及语言;maximumCodeCharacters 是代码字符数上限,maximumParameterBytes 和 maximumResultBytes 是参数及结果的 UTF-8 JSON 字节上限,maximumExecutionsPerSimulation 和 maximumActiveExecutionsPerSimulation 分别限制不同幂等键的累计执行数和同时执行数。nameLookup 给出名称匹配规则及单次名称查询数量上限;exactMatch=true、caseSensitive=true、trimWhitespace=false 分别表示精确匹配、区分大小写、不自动删除空白。

coordinates 和 resourceBinding 说明空间基准与资源绑定;runModes.visualization 表示相应运行模式是否产生动画;maximumUpdatesPerPoll 给出增量批次上限。

10 错误处理​

10.1 请求失败与运行故障​

层次判断字段处理方式
接口请求失败非 2xx HTTP 状态及响应 code按错误码处理参数、权限或服务问题;保留 requestId。请求失败本身不等于实例已经 FAILED
仿真实例失败实例 status=FAILED本次运行进入终态,不能继续或重新启动;读取 statusReasonCode 和 runtimeAvailable,保留可读取的结果与诊断标识,修正原因后创建新实例
模拟对象故障对象 operatingState=FAILED表示该对象在模型中的故障状态,可用于故障时长和状态比例统计;仿真实例可继续运行,以实例 status 为准
某项指标无数据或不适用series.status=NO_DATA / NOT_SUPPORTED 等按每条序列的状态展示,不用零值替代;其他对象或指标的数据仍可使用

FAILED 实例在故障发生前形成的数据属于未完成运行结果,不能作为正常完成运行的最终结果。其保留时间遵循同一资源保留规则;stop 可提前释放。场景加载失败直接返回创建错误,不返回一个可启动的新实例。

网络超时表示调用结果尚未确认。创建请求使用相同 Idempotency-Key 和相同参数重试;控制操作先查询实例状态,再按其幂等规则处理。不要把超时、空数组或单个设备故障直接解释成整个仿真失败。

10.2 请求错误示例​

以下请求把 REAL_TIME 倍速设为 101,超出 1~100 范围。响应为参数错误;已有实例是否仍在运行,需要查询实例状态。

10.3 错误码与处理方式​

HTTPcode客户端处理
400INVALID_REQUEST按字段约束修正请求
400SCRIPT_COMPILATION_FAILED修正脚本代码,以新幂等键执行
400IDEMPOTENCY_KEY_MISSING为创建实例或提交脚本的请求补充幂等键
400INVALID_VISUALIZATION_CURSOR使用快照或增量响应中的完整游标,不自行增加序号
400INVALID_RUN_MODE_PARAMETERS修正模式与参数组合
400FULL_SPEED_END_TIME_REQUIRED提供有限正结束时间
400PAGE_OUT_OF_RANGE减小页码或页大小
401API_KEY_MISSING、API_KEY_INVALID核对凭证是否正确填写
403API_KEY_EXPIRED、API_KEY_DISABLED、SIMULATION_ACCESS_DENIED凭证失效时联系服务提供方;实例访问被拒绝时使用创建该实例的 Key
404SCENE_NOT_FOUND、SIMULATION_NOT_FOUND、TABLE_NOT_FOUND核对标识并按需要重新发现资源
404ENTITY_NOT_FOUND、SCRIPT_NOT_FOUND核对当前实例中的对象名称或 Script 名称
409IDEMPOTENCY_KEY_REUSED同一业务重试保持参数;新业务使用新幂等键
409REQUEST_IN_PROGRESS等待后以原幂等键重试
409INVALID_SIMULATION_STATE先查询状态,再选择合法操作
409ENTITY_NAME_AMBIGUOUS、TABLE_NAME_AMBIGUOUS消除同名歧义;表格可补充所属对象名称
409SCRIPT_EXECUTION_IN_PROGRESS等待当前脚本结束,再提交另一脚本;不因冲突重复受理同一请求
409VISUALIZATION_GENERATION_CHANGED、VISUALIZATION_CURSOR_EXPIRED重新获取动画快照并替换客户端状态
410SIMULATION_RUNTIME_RELEASED运行数据已释放,需要时创建新实例
413RESULT_TOO_LARGE缩小请求范围;无法缩小时联系服务提供方
422SCENE_INVALID、SCENE_LOAD_FAILED、UNSUPPORTED_FIELD_VALUE核对场景数据并携带 requestId 联系服务提供方
422SCRIPT_LANGUAGE_NOT_SUPPORTED选择使用 Groovy 的 Script
429RATE_LIMIT_EXCEEDED、ACTIVE_SIMULATION_LIMIT_EXCEEDED按 Retry-After 等待,或释放不再使用的实例
429SCRIPT_EXECUTION_LIMIT_EXCEEDED该实例不同幂等键的累计执行数已达上限,需要继续执行时创建新实例
500SCRIPT_EXECUTION_FAILED检查脚本及实例状态,保留 requestId;之前的修改可能已生效
500ENGINE_OPERATION_FAILED查询实例状态,保留 requestId 并联系服务提供方
502SCRIPT_RESULT_UNAVAILABLE脚本已结束但结果无法返回;不要自动重复业务操作
502RUNTIME_DATA_READ_FAILED查询实例状态,保留 requestId 并反馈
502ANIMATION_DATA_INVALID、VISUALIZATION_STREAM_FAILED、VISUALIZATION_UNSUPPORTED_ACTION动画数据无法转换;保留 requestId,停止推进游标并联系服务提供方
503OPEN_API_UNAVAILABLE、SCENE_SERVICE_UNAVAILABLE按退避策略重试;创建使用原幂等键

statusReasonCode 与错误 code 职责不同:END_TIME_REACHED 表示达到结束时刻,SIMULATION_COMPLETED 表示正常完成,STOP_REQUESTED 表示请求停止,ENGINE_RUNTIME_ERROR、ENGINE_INSTANCE_LOST 等表示失败原因。运行中若出现未知错误,保留原始 HTTP 状态、code 和 requestId,避免仅根据 message 自动重试非幂等操作。

创建请求网络超时或 503 时,复用原幂等键和原参数;429 按 Retry-After 等待。控制请求的网络结果不明确时,先查询状态。start 相同有效参数、pause、resume、stop 遵循上述幂等语义;不要因响应未收到就发起另一场运行。

脚本异步受理后的失败记录见 脚本状态与结果。HTTP 2xx 与 code=OK 表示请求层成功,脚本业务仍须检查 data.status。动画读取错误时保留原游标,重建快照后再继续。

接口参考与调用示例​

以下为结构示例,未代表当前环境实测。路径中的标识和请求变量使用本次响应或获授权的配置。

查询服务能力​

GET /simulation/openapi/v1/capabilities

取得服务地址与有权限的凭证后先读取本接口;不创建实例。

在测试页打开 →

请求参数

认证头 X-Foresim-Api-Key 由调用方服务端添加;可选 X-Request-Id 用于关联请求。当前接口没有查询字符串参数。

无请求体,不发送空 JSON 代替省略。

请求示例

双花括号是测试页变量,发送时替换;下列模板尚未发送。

GET /simulation/openapi/v1/capabilities
X-Foresim-Api-Key: <api-key>
Accept: application/json

成功响应结构

首次成功 HTTP 200;外层 code=OK。下方是结构示例,值与空数组不代表实测数据。

{
"code": "OK",
"message": "Success",
"requestId": "example_request",
"data": {
"apiVersion": "example",
"simulationTimeUnit": "example",
"coordinates": {
"handedness": "example",
"upAxis": "example",
"lengthUnit": "example",
"rotationRepresentation": "example",
"transformSpace": "example"
},
"runModes": [],
"limits": {
"maximumPageSize": 0,
"maximumEntityNames": 0,
"maximumStatisticProperties": 0,
"maximumUpdatesPerPoll": 0,
"maximumResponseBytes": 0,
"resultRetentionMinutes": 0
},
"visualizationChangeTypes": [],
"resourceBinding": "example",
"animation": {
"eventTypes": [],
"channelProperties": [],
"channelTiming": "example",
"rotationInterpolation": "example",
"clockIncludedInResponses": false
},
"scripts": {
"sourceTypes": [],
"language": "example",
"maximumCodeCharacters": 0,
"maximumParameterBytes": 0,
"maximumResultBytes": 0,
"maximumExecutionsPerSimulation": 0,
"maximumActiveExecutionsPerSimulation": 0
},
"nameLookup": {
"exactMatch": false,
"caseSensitive": false,
"trimWhitespace": false,
"maximumEntityNames": 0
}
}
}
展开完整响应字段定义
字段类型与约束必填说明
apiVersionstring是见字段结构
simulationTimeUnitstring是见字段结构
coordinatesobject是见字段结构
runModesarray是见字段结构
limitsobject是见字段结构
visualizationChangeTypesarray是见字段结构
resourceBindingstring是见字段结构
animationobject是见字段结构
scriptsobject是见字段结构
nameLookupobject是见字段结构

典型失败与下一步

401 检查服务端凭证;403 检查来源和实例归属;400 检查 details 中的字段;409 检查状态、幂等键或名称歧义;410 表示资源已释放;429 按 Retry-After 停止并等待。保留实际 requestId。

{"code":"INVALID_REQUEST","message":"Invalid request","requestId":"example_error","details":[{"field":"request","reason":"检查必填字段和前置状态"}]}

错误示例仅说明报文结构,具体错误码见 错误处理。下一步:创建实例。