ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Forge入门整理:从Access Token到Model Derivative的Viewer接入路径

Forge入门整理:从Access Token到Model Derivative的Viewer接入路径 1. 从 Access Token 到三维视图Forge 入门链路到底卡在哪如果你刚接触 Autodesk Forge大概率会遇到这样一种情况官方文档每一步都写了但把 Access Token、Model Derivative 转换、Viewer 加载串成一条能跑的链路时总会在某个环节报错。要么是 token 过期了没发现要么是 URN 传错格式要么是 Viewer 初始化后一片黑屏。这篇内容就是把这几个环节按真实开发顺序拆开给出可以直接复制的环境变量、请求示例和验证动作让你尽快跑通第一个可交互的三维视图。Forge 这套东西本质上分三层认证层负责拿 Access Token转换层用 Model Derivative 把原始模型转成 Viewer 能识别的 SVF 格式展示层用 Viewer 的 JavaScript 库把转换结果渲染到网页里。三层之间靠两个关键值串联——Access Token 和模型 URN。很多人卡住不是因为某一步不会写而是不知道这两个值在什么时候该传给谁、有效期多久、格式长什么样。适合读这篇的人有基本前端或后端经验能看懂 curl 和 JavaScript但还没完整跑通过 Forge Viewer 的开发者。下面按“拿 token → 传模型 → 转格式 → 加载视图 → 排错”的顺序走每一步都给出可复制的配置和验证方法。2. TaoToken 前置准备把模型转换与 Viewer 接入的调用链先打通在正式写 Forge 代码之前有一个容易被忽略的前置问题Forge 的认证接口和 Model Derivative 接口在部分网络环境下调用不稳定尤其是做批量转换或反复调试 token 的时候请求超时和连接中断会让人误以为是代码写错了。我自己的做法是先把调用链路的出口统一到一个稳定的 API 入口上再开始写业务代码这样排错时能快速区分是“网络问题”还是“参数问题”。TaoToken 在这里的角色是提供一个统一的 API 调用入口把 Forge 认证、模型转换这类需要反复请求的接口调用收敛到同一个 Base URL 下。你不需要改 Forge 的业务逻辑只需要把请求的出口地址换掉Key 和 Model ID 按下面第三节的配置填好即可。这样做的好处是token 刷新、转换任务轮询、manifest 查询这些高频请求不会因为出口不稳定而频繁失败。具体操作上先在 TaoToken 控制台创建一个 API Key然后确认你要用的模型服务 ID。Forge 场景下主要用到两类调用认证类获取 Access Token和转换类提交转换任务、查询 manifest。把这两类请求的 Base URL 统一指向https://taotoken.net/apiKey 用刚创建的那把Model ID 按你实际使用的服务填写。这三件套——Base URL、Key、Model ID——在后面每一处配置里都要保持一致否则会出现 401 或 model not found。如果你还没创建 Key可以直接到控制台的 API Keys 页面生成https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentforge_viewer_guide 。创建时注意权限范围要覆盖认证和模型转换不然后面提交转换任务会被拒。创建完成后把 Key 复制到环境变量里不要硬编码在代码中下面第三节会给出具体的环境变量写法。3. 可复制配置环境变量、认证请求与 Model Derivative 转换参数这一节是整篇的核心所有配置都可以直接复制。先建一个.env文件把 Forge 的客户端信息和 TaoToken 的接入信息分开管理# Forge 应用凭证在 Forge 开发者后台创建 App 后获得 FORGE_CLIENT_IDyour_forge_client_id FORGE_CLIENT_SECRETyour_forge_client_secret # TaoToken 接入三件套 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYsk-xxxxxxxxxxxxxxxx TAOTOKEN_MODEL_IDyour_model_id # 转换目标桶OSS Bucket FORGE_BUCKETmy-forge-bucket拿到 Access Token 的请求把出口指向 TaoToken 的 Base URL请求体和 Forge 官方一致curl -i -X POST \ ${TAOTOKEN_BASE_URL}/authentication/v1/authenticate \ -H Content-Type: application/x-www-form-urlencoded \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -d client_id${FORGE_CLIENT_ID} \ -d client_secret${FORGE_CLIENT_SECRET} \ -d grant_typeclient_credentials \ -d scopecode:all data:write data:read bucket:create bucket:delete正常返回如下expires_in是 3599 秒也就是大约一小时{ access_token: YOUR_ACCESS_TOKEN, token_type: Bearer, expires_in: 3599 }拿到 token 后提交模型转换任务。这里的关键是先把源文件上传到 OSS Bucket拿到 objectKey再 base64 编码成 URN。转换请求的配置片段{ input: { urn: dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXktYnVja2V0L215LW1vZGVsLnJ2dA }, output: { formats: [ { type: svf, views: [2d, 3d] } ] } }提交转换的请求curl -X POST \ ${TAOTOKEN_BASE_URL}/modelderivative/v2/designdata/job \ -H Authorization: Bearer ${ACCESS_TOKEN} \ -H Content-Type: application/json \ -H x-ads-force: true \ -d job.json提交后返回一个 urn这个 urn 就是后面 Viewer 加载模型时要用的 documentId。注意 URN 在 Viewer 里使用时需要加urn:前缀而提交转换时用的是 base64 后的原始字符串两者格式不同这是最常见的错误来源之一。Viewer 的 HTML 引入和初始化配置head meta nameviewport contentwidthdevice-width, minimum-scale1.0, initial-scale1, user-scalableno / meta charsetutf-8 link relstylesheet hrefhttps://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css typetext/css script srchttps://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.min.js/script style body { margin: 0; } #forgeViewer { width: 100%; height: 100%; margin: 0; background-color: #F0F8FF; } /style /head body div idforgeViewer/div /body初始化 Viewer 的 JavaScriptvar viewer; var options { env: AutodeskProduction, api: derivativeV2, getAccessToken: function (onTokenReady) { var token YOUR_ACCESS_TOKEN; var timeInSeconds 3600; onTokenReady(token, timeInSeconds); } }; Autodesk.Viewing.Initializer(options, function () { var htmlDiv document.getElementById(forgeViewer); viewer new Autodesk.Viewing.GuiViewer3D(htmlDiv); var startedCode viewer.start(); if (startedCode 0) { console.error(Failed to create a Viewer: WebGL not supported.); return; } console.log(Initialization complete, loading a model next...); });加载模型var documentId urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXktYnVja2V0L215LW1vZGVsLnJ2dA; Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure); function onDocumentLoadSuccess(viewerDocument) { var defaultModel viewerDocument.getRoot().getDefaultGeometry(); viewer.loadDocumentNode(viewerDocument, defaultModel); } function onDocumentLoadFailure() { console.error(Failed fetching Forge manifest); }以上配置里Base URL、Key、Model ID 三件套在认证请求和转换请求中都要保持一致。如果你用的是 Claude Code 或 Cline 这类工具来辅助写 Forge 代码可以在 MCP 配置里把 TaoToken 的接入信息填进去让工具直接调用模型服务。配置片段参考{ mcpServers: { taotoken: { url: https://taotoken.net/api, apiKey: sk-xxxxxxxxxxxxxxxx, modelId: your_model_id } } }4. 验证请求与成功结果Token 有效期、URN 格式与 Viewer 加载确认配置写完后不要急着写业务逻辑先做三个验证动作确认链路是通的。第一个验证Token 是否有效。拿到 access_token 后用它请求一个轻量接口比如查询 bucket 列表curl -X GET \ ${TAOTOKEN_BASE_URL}/oss/v2/buckets \ -H Authorization: Bearer ${ACCESS_TOKEN}如果返回 200 和 bucket 列表说明 token 有效。如果返回 401检查 token 是否过期超过 3599 秒或 scope 是否包含bucket:read。Token 过期是调试中最常见的问题建议在代码里加一个刷新逻辑每次请求前检查剩余有效期。第二个验证URN 格式是否正确。提交转换任务后查询 manifestcurl -X GET \ ${TAOTOKEN_BASE_URL}/modelderivative/v2/designdata/${URN}/manifest \ -H Authorization: Bearer ${ACCESS_TOKEN}返回的 JSON 里status字段应该是successprogress是complete。如果 status 是pending或inprogress说明转换还没完成需要轮询等待。如果 status 是failed检查源文件格式是否支持以及 URN 是否 base64 编码正确。第三个验证Viewer 是否成功加载。在浏览器控制台里初始化完成后应该看到Initialization complete, loading a model next...加载成功后能看到模型渲染出来。如果控制台报Failed fetching Forge manifest说明 documentId 格式不对或 token 无效。如果报WebGL not supported检查浏览器是否开启了硬件加速。成功加载后你可以在控制台里调用viewer.getScreenShot(800, 600, function(blob){ ... })验证截图功能或者调用viewer.fitToView()确认模型居中显示。这些动作能帮你确认 Viewer 实例是活的而不只是页面没报错。5. 本篇常见错排查401、local proxy failed、reading choices 与 OAuth 报错对照这一节列出实际调试中最容易遇到的几个报错以及对应的排查方向。401 Unauthorized最常见的原因是 token 过期或 scope 不足。Forge 的 token 默认有效期 3599 秒调试时如果反复用同一个 token很容易在半小时后突然全部请求失败。解决办法是在代码里记录 token 获取时间每次请求前判断是否超过 3500 秒超过就重新获取。另一个原因是 scope 没包含需要的权限比如提交转换任务需要data:write查询 manifest 需要data:read。local proxy failed这个报错通常出现在用本地代理工具调试时请求没有正确转发到目标地址。检查你的 Base URL 是否指向了https://taotoken.net/api以及环境变量里的 Key 是否和请求头里的Authorization一致。如果用的是 Cline 或 Claude Code 的 MCP 配置确认url字段没有多余斜杠apiKey没有过期。reading choices 报错这个错误一般出现在调用模型服务返回结果解析时返回体不是预期的 JSON 结构。检查请求的Content-Type是否正确以及 Model ID 是否填对。如果 Model ID 写错服务端可能返回一个 HTML 错误页而不是 JSON解析时就会报 reading choices 失败。OAuth 相关报错Forge 的认证接口对grant_type和scope的格式要求严格。grant_type必须是client_credentialsscope里的多个权限用空格分隔不能有逗号。如果返回invalid_scope检查 scope 字符串是否有多余空格或拼写错误。另外client_id和client_secret必须和 Forge 后台创建 App 时的一致复制时注意不要带多余空格。Viewer 黑屏但无报错这种情况通常是模型加载了但相机位置不对或者模型本身没有几何数据。先调用viewer.fitToView()试试如果还是黑屏检查 manifest 里是否有geometry类型的衍生文件。如果转换时只选了 2D 视图3D 视图下就会黑屏。URN 格式错误提交转换时用的是 base64 字符串Viewer 加载时需要加urn:前缀。如果直接把 base64 字符串传给Document.load会报 manifest 获取失败。正确的做法是var documentId urn: base64Urn;。6. 语义一致 CTA从跑通第一个视图到长期编码与 Agent 接入跑通第一个可交互三维视图之后下一步通常是把它集成到实际业务里比如批量转换模型、在 Viewer 里做构件选中和属性查询、或者把 Forge 的调用封装成后端服务。这些场景下API 调用的稳定性和 Key 的管理会变得更重要。如果你在调试认证和转换接口时遇到连接问题可以直接用 TaoToken 的 API 入口统一出口Key 在控制台管理避免硬编码。需要新建或轮换 Key 的话入口在这里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentforge_viewer_guide 。接入文档里有认证和模型转换的完整参数说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentforge_viewer_guide 。如果你更习惯在对话里直接验证模型返回可以用模型对话页面快速测试请求格式https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentforge_viewer_guide 。长期做 Forge 集成或 Agent 开发的话Coding Plan 更适合把调用链固定下来https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentforge_viewer_guide 。最后说一个实际踩过的坑Forge 的 token 有效期是 3599 秒但 Viewer 初始化时传入的timeInSeconds如果写成 3600偶尔会在边界时间出现 token 已过期但 Viewer 还在用的状态。稳妥的做法是传 3500留出刷新余量。这个细节官方文档没强调但在长时间运行的页面里很关键。
返回列表