Autodesk Forge图纸上传翻译问题排查及DBID属性获取
排查Autodesk Forge getManifest报错及获取部件DBID与属性方案
一、getManifest报错排查方向
既然文件在官方demo中可正常处理,问题基本集中在自身集成流程,从以下维度排查:
- 鉴权权限不足:确认调用
getManifest的Access Token包含viewables:read和data:read权限。生成Token时的scope参数必须覆盖这两项,权限缺失会直接返回403/401错误。 - URN编码错误:Forge要求URN为Base64编码且需移除末尾所有
=字符。若传入的URN未做标准编码(比如保留等号、编码格式错误),会触发无效请求或404错误。 - 翻译任务未完成:调用
getManifest前必须验证翻译状态。通过接口返回的status字段判断,仅当值为success时清单才可正常获取;若处于pending/inprogress状态就调用,会返回未就绪类错误。 - 文件与Bucket关联异常:确认上传文件的Bucket与翻译任务绑定的Bucket一致,且文件在Bucket中存在。可调用OSS API的
GET /oss/v2/buckets/{bucketKey}/objects/{objectName}接口验证文件状态。 - API版本/端点错误:确保使用Model Derivative API v2版本,端点地址为
https://developer.api.autodesk.com/modelderivative/v2/designdata/{urn}/manifest,旧版本端点存在兼容性问题。
二、对应修复方案
- 权限修正:生成Token时,将
scope设为"data:read viewables:read"(或包含这两项的更大权限集合),重新获取Token后重试。 - URN标准化处理:对原始URN做Base64编码后移除末尾等号,示例代码:
const rawUrn = 'urn:adsk.objects:os.object:mybucket/mydrawing.dwg'; const encodedUrn = btoa(rawUrn).replace(/=/g, ''); - 等待翻译完成:实现轮询逻辑,每隔3-5秒调用一次
getManifest,直到status变为success再执行后续操作,示例:async function waitForTranslation(urn, token) { let status = 'pending'; while (status !== 'success') { const res = await fetch(`https://developer.api.autodesk.com/modelderivative/v2/designdata/${urn}/manifest`, { headers: { 'Authorization': `Bearer ${token}` } }); const manifest = await res.json(); status = manifest.status; if (status === 'failed') throw new Error('Translation failed'); await new Promise(resolve => setTimeout(resolve, 3000)); } } - 验证文件存在性:触发翻译任务前,先通过OSS API确认文件已上传至目标Bucket,避免因文件缺失导致翻译失败。
三、获取所有部件DBID及其属性
翻译完成后,按以下步骤提取数据:
- 获取Viewable的GUID:从
getManifest返回的清单中,找到type为geometry的Viewable节点,提取其guid(路径为derivatives[].children[].guid)。 - 调用属性查询API:使用上述GUID调用
GET /modelderivative/v2/designdata/{urn}/metadata/{guid}/properties接口,获取全量部件属性。返回的data.collection数组中,每个元素的objectid即为DBID,properties字段为对应属性集合。 - 整理数据:遍历返回结果,提取DBID与对应属性,示例代码:
async function getComponentData(urn, guid, token) { const res = await fetch(`https://developer.api.autodesk.com/modelderivative/v2/designdata/${urn}/metadata/${guid}/properties`, { headers: { 'Authorization': `Bearer ${token}` } }); const data = await res.json(); return data.data.collection.map(item => ({ dbid: item.objectid, properties: item.properties })); }
注意:若模型包含多个Viewable,需逐个处理对应的GUID,确保覆盖所有部件。
内容的提问来源于stack exchange,提问作者Hari Priya
相关产品推荐
相关产品推荐

