【问题标题】:Model derivative API - SVF POST Job always returns 400 - Request body is not a valid json模型衍生 API - SVF POST 作业总是返回 400 - 请求正文不是有效的 json
【发布时间】:2016-07-29 11:56:15
【问题描述】:

我在创建 POST JOB(用于在 OSS 中注册文件以进行翻译的新名称)时遇到问题。我已经使用分段上传将 ZIP 文件上传到存储桶(包含 2 个 revit 文件,第一个是 root,第二个是 revitlink),有它的 URN,现在我想触发转换为 SVF。为此,我正在使用这段代码(使用 Restharp、Newtonsoft.Json):

    public void CreatePostJOB(string serviceUrl, string urn, string rootFile, string token)
    {
        try
        {
            RestClient client = new RestClient(serviceUrl);
            RestRequest request = new RestRequest();

            request.Method = Method.POST;
            request.Resource = "modelderivative/v2/designdata/job";
            request.RequestFormat = DataFormat.Json;

            request.AddParameter("Authorization", "Bearer " + token, ParameterType.HttpHeader);
            request.AddParameter("x-ads-force", true);
            request.AddParameter("Content-Type", "application/json");

            JObject jsonbody = new JObject
                    (
                        new JProperty("input", new JObject
                            (
                                new JProperty("urn", urn),
                                new JProperty("compressedUrn", true),
                                new JProperty("rootFileName", rootFile)
                            )),
                        new JProperty("output", new JObject
                            (
                                new JProperty("formats", new JArray
                                    (
                                        new JObject
                                                (
                                                    new JProperty("type", "svf"),
                                                    new JProperty("views", new JArray("3d", "2d"))
                                                )
                                    ))
                            ))
                    );


            string post = jsonbody.ToString(Formatting.Indented);

            request.AddParameter("application/json", post, ParameterType.RequestBody);

            IRestResponse resp = client.Execute(request);

            if (resp.StatusCode == HttpStatusCode.OK)
            {
                //TODO
            }
        }
        catch (Exception ex)
        {
            //TODO
        }
    }

上面的代码将生成以下 JSON 到 post 变量中:

{
  "input": {
    "urn": "/*urn base64 string with no padding*/",
    "compressedUrn": true,
    "rootFileName": "MainModel_A.rvt"
  },
  "output": {
    "formats": [
      {
        "type": "svf",
        "views": [
          "3d",
          "2d"
        ]
      }
    ]
  }

不管我怎么改这段代码结果总是一样的:

{"diagnostic":"Request body is not a valid json"}

我也尝试使用普通的 C# WebRequest 获得相同的结果。也许有一个错误,因为来自同一 API 的其他调用与 restsharp 一起工作就像一个魅力。请问如何在 C# 中创建有效的发布作业?

【问题讨论】:

    标签: c# post autodesk-forge autodesk-model-derivative


    【解决方案1】:

    作为mentioned by @XiaodongLiang,使用rootFilename(完全一样),否则无法识别。

    现在你的 C# 代码应该是(在我这边工作):

    RestClient client = new RestClient(serviceUrl);
    RestRequest request = new RestRequest();
    request.Method = Method.POST;
    request.Resource = "modelderivative/v2/designdata/job";
    request.AddHeader("Accept", "application/json");
    request.AddParameter("Authorization", "Bearer " + token, ParameterType.HttpHeader);
    request.AddParameter("application/json", jsonbody.ToString(Formatting.None), ParameterType.RequestBody);
    
    IRestResponse resp = client.Execute(request);
    
    if (resp.StatusCode == HttpStatusCode.OK)
    {
      //TODO
    }
    

    我建议您更改您的 app.config with this parameters,这应该可以帮助您调试您的请求(在本例中为标头)。

    【讨论】:

    • 我将 AddParameter 调用更改为 AddHeader,结果错误仍然是 400 - BAD REQUEST,只有错误消息更改为:“无法触发此文件的翻译。”很难说使用可恢复上传的事实是否会影响这一点。
    • 这意味着翻译不工作...... JSON 请求是好的。您是否使用带有所有 .rvt 的 .zip 文件?你能补充更多信息吗?
    • 还要注意您的原始代码使用compressedUrn=true,这意味着它是一个包含所有.rvt 文件的.zip。是这样吗?如果您只有一个 .rvt,只需传递它的 urn。
    • 我终于让它工作了,在为文件选择 objectKey 时,缺少扩展名显然是强制性的。当说“为您的对象选择一个名称。这可以是实际的文件名或类似于数据管理系统生成的 GUID 之类的东西。是否必须保留扩展名时,文档有点令人困惑。” (来源:developer.autodesk.com/en/docs/data/v2/tutorials/…
    • 感谢分享。如果您只想上传文件进行存储,那么您可以随意命名 - 扩展名无关紧要。但是 Model Derivative API(您在其中发布翻译 JOB)将查看扩展来决定使用哪个翻译器。
    【解决方案2】:

    我不确定它是否区分大小写,但看起来您写为“rootFileName”,而帮助显示为“rootFilename”

    我昨天碰巧写了一篇关于这个话题的博客。我还提供了一个测试工具,可以很好地与演示 Revit 文件(带有链接文件)配合使用。如果您的文件不大,您能否在该博客中使用我的测试工具(Node.js)对其进行检查?我没有添加续传,所以最好测试比较小的文件。
    http://adndevblog.typepad.com/cloud_and_mobile/2016/07/translate-referenced-files-by-derivative-api.html

    如果这不起作用,您能否将 URN 发给我(您可以通过 xiaodong.liang@autodesk.com 给我发邮件)。我可以在后端咨询我们的团队。

    问候,

    梁晓东

    锻造崇拜者

    开发者技术服务

    欧特克

    【讨论】:

    • 我实际上都试过了,这只是一个错字。不幸的是,我不可能测试在 Node.js 上运行的任何东西,因为我完全没有这方面的经验,而且我的问题与 C# 有关,因为这段代码将在服务器 Windows 服务上运行。
    • 在我们的节点示例上运行良好,因此至少它表明此时 API 没有错误。我建议您首先使用一个简单的非压缩文件进行测试,然后使用 REST 客户端(例如 postman,派生 POST 端点)进行测试,我们在那里有一篇文章描述了如何操作:adndevblog.typepad.com/cloud_and_mobile/2016/06/…。跨度>
    • 我尝试了非压缩文件,结果相同,我会看看邮递员并尽快更新
    • 我试过邮递员,得到了令牌,但似乎有问题,因为它只能做三足授权,当我得到例如。存储桶对象详细信息显示“ACM 检查失败,用户或调用服务无权执行此操作”。仍然不明白这应该如何帮助我解决我的 C# 问题..
    猜你喜欢
    • 2018-12-20
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多