从 Autodesk A360 创建带有 URN 的查看器应用程序
Creating a viewer application with an URN from Autodesk A360
我创建了一个查看器应用程序,它使用两方验证并显示已上传到我自己的存储桶中的项目。现在,我不想查看我自己存储桶中的项目,而是希望能够查看已上传到 Autodesk A360 的项目。
为此,我完成了以下步骤:
- 实现三足认证(项目A360账号与正在认证的账号相同)
- 已访问中心、项目和文件,如 https://developer.autodesk.com/en/docs/data/v2/tutorials/download-file/ 中所述。
- 不是下载项目并将其上传到我自己的存储桶,如 https://developer.autodesk.com/en/docs/data/v2/tutorials/app-managed-bucket/ 中所述,而是获取了标识符
(
urn:adsk.wipprod:fs.file:vf.6bVr4EVDSaOpykczeQYR2Q?version=1
) 从文件请求的结果并将其转换为 URL 友好的 Base64 (dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXktYnVja2V0L215LWF3ZXNvbWUtZm9yZ2UtZmlsZS5ydnQ=
).
因此,转换后的 URN 应该与 A360 用于其自己的查看器的相同。
在我自己的应用程序上查看带有 URN 的项目时,网络控制台显示以下错误消息:
查看具体请求时,返回如下响应:
我还确保转换后的 URN 与 A360 使用的 URN 相同。为此,我将其与 A360 的响应进行了比较:
所以由于查看器在A360中工作,我想知道A360中的项目是否也可以在我自己的应用程序中查看(A360查看器的存储桶已经存在,因此没有理由重复相同的存储桶创建和上传文件的过程)。
如果同一个项目可以使用URN,那么我也想知道为什么请求未授权。
如果您需要任何其他代码,请务必询问。
您可以在 GiHub 上查看以下三个示例,这三个示例均访问 A360 上的 CAD 模型并在查看器中显示它们:
数据管理APIP样本:https://github.com/Developer-Autodesk/data.management.api-nodejs-sample
模型导数API样本:https://github.com/Developer-Autodesk/model.derivative.api-nodejs-sample
实时往返 BIM 编辑器:https://github.com/jeremytammik/model.derivative.api-nodejs-sample-roomedit3d
roomedit3dv2 roomedit3dv2 round-trip Forge BIM edi,8 分钟演示记录提供了它的工作证明:
https://www.youtube.com/watch?v=bDI5YX7PDP8
祝你好运!
在 https://github.com/Developer-Autodesk/data.management.api-nodejs-sample 将我的解决方案与 Augusto Goncalves 的应用程序进行比较后,我终于设法解决了问题。
- Instead of downloading the project and uploading it to my own bucket, as described in https://developer.autodesk.com/en/docs/data/v2/tutorials/app-managed-bucket/, gotten the identificator (
urn:adsk.wipprod:fs.file:vf.6bVr4EVDSaOpykczeQYR2Q?version=1
) from the result of the file request and converted it to an URL-friendly Base64 (dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXktYnVja2V0L215LWF3ZXNvbWUtZm9yZ2UtZmlsZS5ydnQ=
).
虽然此方法 returns 一个正确的 URN,但除了 URN 之外,还必须将 acmsession
添加到请求中。从上面的示例代码中,我设法对以下请求进行了逆向工程:
curl -X 'POST' \
-H "Authorization: Bearer $token" -H 'Content-Type: application/json' \
-v 'https://developer.api.autodesk.com/oss-ext/v1/acmsessions' -d \
'{
"application": "autodesk",
"x-ads-acm-check-groups": "true",
"x-ads-acm-namespace": "WIPDM"
}'
这个请求的结果returns一个代码,必须添加到 URN。与其将其添加到请求的末尾 URL,不如将其添加到被调用的方法中:
viewer.load(doc.getViewablePath(geometryItems[0]), null, null, null, doc.acmSessionId /*session for DM*/);
使用此解决方案需要对查看器的实例化进行更改。我没有像 https://developer.autodesk.com/en/docs/viewer/v2/tutorials/basic-viewer/ 中描述的那样做,而是将其更改为上面示例代码的 index.js
文件中的解决方案。
我已经从开发团队那里得到确认,您不应使用 ACM headers 或依赖 WIPDM urn 直接加载您的可视内容。这将在将来的某个时候停止工作。我们会直接在衍生服务中添加一些逻辑,将其抽象出来,让你来做。
不幸的是,目前更喜欢使用 A360 项目版本中的存储 URN 和 post 自定义 svf 作业,它将生成一组您可以依赖的新可视项。
具体例子可以看我的forge sample
//pick the last version by default
var version = item.versions[ item.versions.length - 1 ]
var storageUrn = window.btoa(
version.relationships.storage.data.id)
// !IMPORTANT: remove all padding '=' chars
// not accepted by the adsk services
storageUrn = storageUrn.replace(new RegExp('=', 'g'), '')
var urn = version.relationships.derivatives.data.id
console.log('A360 URN: ' + urn) // -> just for info
console.log('Storage URN: ' + storageUrn) // -> use this URN to POST svf and trigger translation
我创建了一个查看器应用程序,它使用两方验证并显示已上传到我自己的存储桶中的项目。现在,我不想查看我自己存储桶中的项目,而是希望能够查看已上传到 Autodesk A360 的项目。
为此,我完成了以下步骤:
- 实现三足认证(项目A360账号与正在认证的账号相同)
- 已访问中心、项目和文件,如 https://developer.autodesk.com/en/docs/data/v2/tutorials/download-file/ 中所述。
- 不是下载项目并将其上传到我自己的存储桶,如 https://developer.autodesk.com/en/docs/data/v2/tutorials/app-managed-bucket/ 中所述,而是获取了标识符
(
urn:adsk.wipprod:fs.file:vf.6bVr4EVDSaOpykczeQYR2Q?version=1
) 从文件请求的结果并将其转换为 URL 友好的 Base64 (dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXktYnVja2V0L215LWF3ZXNvbWUtZm9yZ2UtZmlsZS5ydnQ=
).
因此,转换后的 URN 应该与 A360 用于其自己的查看器的相同。
在我自己的应用程序上查看带有 URN 的项目时,网络控制台显示以下错误消息:
查看具体请求时,返回如下响应:
我还确保转换后的 URN 与 A360 使用的 URN 相同。为此,我将其与 A360 的响应进行了比较:
所以由于查看器在A360中工作,我想知道A360中的项目是否也可以在我自己的应用程序中查看(A360查看器的存储桶已经存在,因此没有理由重复相同的存储桶创建和上传文件的过程)。 如果同一个项目可以使用URN,那么我也想知道为什么请求未授权。
如果您需要任何其他代码,请务必询问。
您可以在 GiHub 上查看以下三个示例,这三个示例均访问 A360 上的 CAD 模型并在查看器中显示它们:
数据管理APIP样本:https://github.com/Developer-Autodesk/data.management.api-nodejs-sample
模型导数API样本:https://github.com/Developer-Autodesk/model.derivative.api-nodejs-sample
实时往返 BIM 编辑器:https://github.com/jeremytammik/model.derivative.api-nodejs-sample-roomedit3d
roomedit3dv2 roomedit3dv2 round-trip Forge BIM edi,8 分钟演示记录提供了它的工作证明:
https://www.youtube.com/watch?v=bDI5YX7PDP8
祝你好运!
在 https://github.com/Developer-Autodesk/data.management.api-nodejs-sample 将我的解决方案与 Augusto Goncalves 的应用程序进行比较后,我终于设法解决了问题。
- Instead of downloading the project and uploading it to my own bucket, as described in https://developer.autodesk.com/en/docs/data/v2/tutorials/app-managed-bucket/, gotten the identificator (
urn:adsk.wipprod:fs.file:vf.6bVr4EVDSaOpykczeQYR2Q?version=1
) from the result of the file request and converted it to an URL-friendly Base64 (dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXktYnVja2V0L215LWF3ZXNvbWUtZm9yZ2UtZmlsZS5ydnQ=
).
虽然此方法 returns 一个正确的 URN,但除了 URN 之外,还必须将 acmsession
添加到请求中。从上面的示例代码中,我设法对以下请求进行了逆向工程:
curl -X 'POST' \
-H "Authorization: Bearer $token" -H 'Content-Type: application/json' \
-v 'https://developer.api.autodesk.com/oss-ext/v1/acmsessions' -d \
'{
"application": "autodesk",
"x-ads-acm-check-groups": "true",
"x-ads-acm-namespace": "WIPDM"
}'
这个请求的结果returns一个代码,必须添加到 URN。与其将其添加到请求的末尾 URL,不如将其添加到被调用的方法中:
viewer.load(doc.getViewablePath(geometryItems[0]), null, null, null, doc.acmSessionId /*session for DM*/);
使用此解决方案需要对查看器的实例化进行更改。我没有像 https://developer.autodesk.com/en/docs/viewer/v2/tutorials/basic-viewer/ 中描述的那样做,而是将其更改为上面示例代码的 index.js
文件中的解决方案。
我已经从开发团队那里得到确认,您不应使用 ACM headers 或依赖 WIPDM urn 直接加载您的可视内容。这将在将来的某个时候停止工作。我们会直接在衍生服务中添加一些逻辑,将其抽象出来,让你来做。
不幸的是,目前更喜欢使用 A360 项目版本中的存储 URN 和 post 自定义 svf 作业,它将生成一组您可以依赖的新可视项。
具体例子可以看我的forge sample
//pick the last version by default
var version = item.versions[ item.versions.length - 1 ]
var storageUrn = window.btoa(
version.relationships.storage.data.id)
// !IMPORTANT: remove all padding '=' chars
// not accepted by the adsk services
storageUrn = storageUrn.replace(new RegExp('=', 'g'), '')
var urn = version.relationships.derivatives.data.id
console.log('A360 URN: ' + urn) // -> just for info
console.log('Storage URN: ' + storageUrn) // -> use this URN to POST svf and trigger translation