Производный от модели API — задание SVF POST всегда возвращает 400 — тело запроса не является допустимым json

У меня возникли проблемы с созданием 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 в переменную сообщения:

{
  "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"}

Я также пытался использовать обычный С# WebRequest с тем же результатом. Возможно, есть ошибка, потому что другие вызовы из того же API работают с restsharp как шарм. Пожалуйста, как мне создать действительное почтовое задание на С#?


person JadaVonRuth    schedule 29.07.2016    source источник


Ответы (2)


Как упоминается @XiaodongLiang, используйте rootFilename (именно так), иначе не распознает.

Теперь ваш код С# должен быть (работает с моей стороны):

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 с этими параметрами, что должно помочь вам отладить ваши запросы (в данном случае заголовки ).

person Augusto Goncalves    schedule 29.07.2016
comment
Я изменил вызовы AddParameter на AddHeader, и ошибка результата осталась 400 - BAD REQUEST, только сообщение об ошибке изменилось на: Не удалось инициировать перевод для этого файла. Трудно сказать, может ли на это повлиять тот факт, что использовалась возобновляемая загрузка. - person JadaVonRuth; 29.07.2016
comment
это означает, что перевод не работает... запрос JSON в порядке. Вы используете .zip со всеми .rvt? Можете ли вы добавить больше информации? - person Augusto Goncalves; 29.07.2016
comment
также обратите внимание, что в исходном коде используется сжатиеUrn=true, что означает, что это .zip со всеми файлами .rvt. Так ли это? Если у вас есть только .rvt, просто передайте его. - person Augusto Goncalves; 29.07.2016
comment
Наконец-то я заставил его работать, возникла проблема с отсутствующим расширением, которое, по-видимому, является обязательным при выборе objectKey для файла. Документация немного сбивает с толку, когда говорит Выберите имя для вашего объекта. Это может быть фактическое имя файла или что-то вроде GUID, сгенерированного системой управления данными. Не очевидно, нужно ли сохранять расширение. (источник: developer.autodesk.com/en/ документы/данные/v2/учебники/ ) - person JadaVonRuth; 29.07.2016
comment
Спасибо, что поделился. если вы просто хотите загрузить файл для хранения, вы можете назвать его как хотите - расширение не имеет значения. Но Model Derivative API (куда вы публикуете JOB перевода) будет смотреть на расширение, чтобы решить, какой переводчик использовать. - person Augusto Goncalves; 29.07.2016
comment
@JardaDaníček еще раз спасибо за ваш отзыв, только что сделал запрос на улучшение этой части документации. - person Augusto Goncalves; 29.07.2016

Я не уверен, чувствителен ли он к регистру, но похоже, что вы написали как «rootFileNname», в то время как в справке указано «rootFilenname».

Вчера мне довелось написать блог на такую ​​тему. Я также предоставил тестовую обвязку, которая хорошо работает с демонстрационным файлом Revit (со связанным файлом). Если ваши файлы невелики, не могли бы вы проверить это с помощью моего тестового набора (Node.js) в этом блоге? Я не добавил возобновляемую загрузку, поэтому лучше протестировать относительно небольшие файлы.
http://adndevblog.typepad.com/cloud_and_mobile/2016/07/translate-referenced-files-by-производный-api.html

Если это не сработает, не могли бы вы прислать мне URN (вы можете написать мне по адресу [email protected]). Я могу проконсультироваться с нашей командой на бэкэнде.

С уважением,

Сяодун Лян

Кузница Адоватер

Технические службы разработчиков

Автодеск

person Xiaodong Liang    schedule 29.07.2016
comment
На самом деле я пробовал оба, это просто опечатка. К сожалению, у меня нет возможности протестировать что-либо, работающее на Node.js, поскольку у меня нет абсолютно никакого опыта в этом, и мой вопрос связан с C #, потому что этот код будет работать на серверной службе Windows. - person JadaVonRuth; 29.07.2016
comment
На наших образцах узлов работает нормально, так что, по крайней мере, показывает, что на данный момент в API нет ошибок. Я бы порекомендовал вам сначала протестировать простой несжатый файл, а также протестировать с клиентом REST, таким как postman, производная конечная точка POST, у нас есть сообщение, описывающее, как это сделать: adndevblog.typepad.com/cloud_and_mobile/ 2016/06/. - person Philippe; 29.07.2016
comment
Я попробовал несжатый файл с тем же результатом, я посмотрю на почтальоне и скоро обновлю - person JadaVonRuth; 29.07.2016
comment
Я попробовал почтальон, получил токен, но, похоже, есть проблема, потому что он может выполнять только трехэтапную авторизацию, когда я не получаю, например. сведения об объекте ведра показывают, что проверка ACM не удалась, пользователь или вызывающая служба не имеют доступа для выполнения этой операции. До сих пор не понимаю, как это должно помочь мне с моим вопросом на С#. - person JadaVonRuth; 29.07.2016