【问题标题】:Why can't I patch, update, or delete an AppPackage that I created?为什么我不能修补、更新或删除我创建的 AppPackage?
【发布时间】:2019-08-17 08:21:09
【问题描述】:

我正在尝试更改使用设计自动化 API v2 发布的 AppPackage 的所需引擎版本。

我尝试过使用 Postman 和 Forge 节点客户端。我使用 Forge 文档作为参考。

https://forge.autodesk.com/en/docs/design-automation/v2/reference/http/AppPackages(':id')-PATCH/

我的凭据是正确的,并且我有一个有效的令牌,但由于某种原因,我不断收到 404 Not Found 状态和一个错误,上面写着“名为 MyPlugin 的 AppPackage 不属于你。你不能在 AppPackage 上操作你不拥有。”此外,当我尝试删除或更新 AppPackage 时,我也会收到相同的消息。

这真的很奇怪,因为我绝对拥有这个 AppPackage。我使用这些相同的凭据上传了它,我可以通过执行 GET 请求来查看我的所有 AppPackages。此外,AppPackage 的名称是正确的,并且我在验证时指定了正确的范围(代码:all)。

为什么 Design Automation 认为这个 AppPackage 不属于我,为什么我不能修补、更新或删除它?

2019 年 3 月 28 日更新:设置资源值仍会导致相同的错误

2019 年 4 月 2 日更新:获取新的上传 URL 也不起作用。我收到一个内部服务器错误,提示“对象引用未设置为对象的实例。”


const ForgeSDK = require('forge-apis');
const oAuth2TwoLegged = new ForgeSDK.AuthClientTwoLegged(FORGE_CLIENT_ID, FORGE_CLIENT_SECRET, SCOPES);
const appPackageApi = new ForgeSDK.AppPackagesApi();

const getToken = () => {
    return oAuth2TwoLegged.authenticate();
};

const getUploadURL = () => {
    return appPackageApi.getUploadUrl(oAuth2TwoLegged, oAuth2TwoLegged.getCredentials());
};

const patchPackage = (id, url) => {

    const appPack = {
        Resource: url,
        RequiredEngineVersion: APP_PACKAGE_REQUIRED_ENGINE
    };

    return appPackageApi.patchAppPackage(id, appPack, oAuth2TwoLegged, oAuth2TwoLegged.getCredentials());
};


(async () => {

    try {
        const token = await getToken();
        const url = await getUploadURL();
        const patchPackRes = await patchPackage(APP_PACKAGE_ID, url);

        if (patchPackRes.statusCode == 201)
            console.log('Patch package succeeded!');
        else
            console.log('Patch package failed!' + patchPackRes.statusCode);

    } catch (ex) {
        console.log('Exception  :(');
        console.log(ex);
    }

})();

【问题讨论】:

  • 您能否将新的/修改的应用程序包放到您从GetUploadUrl 检索到的 aws 上传 URL,然后运行 ​​PATCH 应用程序包。看看有没有帮助。
  • 仍然不成功。我不再收到“不属于你”错误,但我收到“对象引用未设置为对象的实例”错误。我已经用最新的代码 sn-p 更新了我的问题。
  • 我刚刚尝试了 PATCH apppackage,在我的end 工作,你能告诉我 JSON 负载吗?我相信缺少一些微不足道的东西。
  • { "uri": "https://developer.api.autodesk.com/autocad.io/us-east/v2/AppPackages(%27MyPlugin%27)", "method": " PATCH", "qs": {}, "timeout": 60000, "body": { "Resource": "https: xxxxxxx", "RequiredEngineVersion": "23.0" }, "json": true, "headers": { "Content-Type": "application/json", "Accept": "application/vnd.api+json,application/json", "Authorization": "Bearer xxxxxxx" }, "agentOptions": { "secureProtocol": “TLSv1_2_method”} }
  • ^ 我正在使用 Forge Node 客户端,这些是我从源代码控制台记录的请求参数。

标签: autodesk-forge autodesk-designautomation


【解决方案1】:

这应该可行:

const ForgeSDK = require('forge-apis');
const oAuth2TwoLegged = new ForgeSDK.AuthClientTwoLegged(FORGE_CLIENT_ID, FORGE_CLIENT_SECRET, SCOPES);
const appPackageApi = new ForgeSDK.AppPackagesApi();

const getToken = () => {
    return oAuth2TwoLegged.authenticate();
};

const getUploadURL = async (id) => {
    const app =  await appPackageApi.getAppPackage(id, oAuth2TwoLegged, oAuth2TwoLegged.getCredentials());
    return app.body.Resource;
};

const patchPackage = (id, url) => {

    const appPack = {
        Resource: url,
        RequiredEngineVersion: APP_PACKAGE_REQUIRED_ENGINE
    };

    return appPackageApi.patchAppPackage(id, appPack, oAuth2TwoLegged, oAuth2TwoLegged.getCredentials());
};


(async () => {

    try {
        const token = await getToken();
        const url = await getUploadURL(APP_PACKAGE_ID);
        const patchPackRes = await patchPackage(APP_PACKAGE_ID, url);

        if (patchPackRes.statusCode == 201)
            console.log('Patch package succeeded!');
        else
            console.log('Patch package failed!' + patchPackRes.statusCode);

    } catch (ex) {
        console.log('Exception  :(');
        console.log(ex);
    }

})();

【讨论】:

  • 注意PATCH操作成功返回204。
  • 此代码适用于我的所有 AppPackage,除了一个。我不能用那个 AppPackage 做任何事情,因为它显然不属于我。资源 URL 一定有问题。奇怪的是,当我在浏览器中导航到资源 URL 时,AppPackage 文件会立即下载,并且它是我期望的大小。
  • 我终于修补了AppPackage。我有两个 Forge 帐户,一个用于开发,一个用于生产。两个帐户都有一个同名的 AppPackage。我注意到生产 AppPackage 是公开的,而开发 AppPackage 是私有的。当我将生产 AppPackage 更改为私有时,我能够修补开发 AppPackage。我没有做任何其他事情,所以我假设这是解决方案。你能确认一下吗?
【解决方案2】:

调用 PATCH 时,必须设置“资源”属性。它可以设置为与您从 GET 收到的 URL 相同的 URL,但它必须存在且有效。

【讨论】:

  • 顺便说一句,如果您正在开发新的应用程序,那么我建议您使用新的 V3 API。 V2 将被弃用。
  • 我设置了“资源”属性,但仍然遇到同样的错误。我用代码 sn-p 更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
相关资源
最近更新 更多