404 Публикация контента в Desire2Learn

У меня есть базовая сборка приложения Valence для Desire2Learn, и теперь я пытаюсь POST-данные и получаю ошибку 400 или 404.

Если я сделаю GET-запрос к /d2l/api/le/(D2LVERSION: версия)/(D2LID: orgUnitId)/content/root/ с правильным orgUnitId, я могу увидеть весь контент для курса. Тем не менее, когда я POST ContentObjectData типа Module, он возвращает 400. В документах ничего не перечислено для ошибки 400 для этого конкретного запроса, но я предполагаю, что я испортил ContentObjectData. Я пробовал несколько раз, но это всегда приводит к 400. Блок JSON выглядит следующим образом: { "Title": "API Test", "ShortTitle": "", "Type": 0, "ModuleStartDate": null, "ModuleEndDate": null, "IsLocked": false, "IsHidden": true }

Если я сделаю запрос GET для /d2l/api/le/(D2LVERSION: версия)/(D2LID: orgUnitId)/content/modules/(D2LID: moduleId)/structure/, с правильными orgUnitId и moduleId, я могу видеть содержание модуля. Когда я отправляю ContentObjectData типа Topic, он возвращает 404. Я делаю это на Python, который не содержит пример кода SDK, поэтому я преобразовал PHP.

Я использовал другой блок JSON с ключом "Url" и соответствующим значением. Вот полностью закодированное многочастное тело, которое я пытался отправить:

    --redacted.132.0.68062.1336325296.611.1
    Content-Disposition: form-data; name="ContentObjectData"
    Content-Type: application/json

    {"StartDate": null, "IsLocked": false, "TopicType": 3, "ShortTitle":
"", "Title": "API Test", "Url": "http://redacted.edu",
"EndDate": null, "IsHidden": true, "Type": 1}
    --redacted.132.0.68062.1336325296.611.1
    Content-Type: application/json

    {"Url": "http://redacted.edu"}
    --redacted.132.0.68062.1336325296.611.1--

Почему один и тот же URI для GET и POST приводит к 404 только для POST? Похоже, что между двумя вызовами в документации структура не отличается. Я попробовал этот вызов как обычный запрос POST и как составной, но оба результата привели к 404. Я пробовал оба этих вызова с использованием 3 разных пользователей, один из которых имеет полные права администратора.

1 ответ

Решение

Это похоже на два разных вопроса, один о маршруте /d2l/api/le/{ver}/{orgUnitId}/content/root/ и один о маршруте /d2l/api/le/{ver}/{orgUnitId}/content/modules/{moduleId}/ структура /. Я постараюсь обратиться к этим отдельно:

Добавление корневого модуля. Первый маршрут используется для добавления модуля маршрута в репозиторий контента организации. Маршрут имеет особые ограничения для свойств "Заголовок" и "Короткий заголовок": оба должны быть ненулевыми и непустыми. Кроме того, свойство ShortTitle должно быть в форме, которую нельзя "обрезать" до пустой строки (например, это не может быть строка, в которой есть только пробел). Немного отличающиеся ограничения на эти строки были признаны несогласованными, и в будущем выпуске может появиться более регулярный подход. Вы в безопасности, если вы выберете подход, который вы должны предоставить заголовок и краткое название для новых корневых модулей.

Добавление темы в существующую структуру контента. Второй маршрут используется для добавления в существующую структуру модуля в репозитории контента организации. Способ использования маршрута зависит от того, хотите ли вы добавить URL-адрес или хотите добавить файл.

Чтобы добавить тему, которая является не чем иным, как URL, вам нужно предоставить только первую часть составного / смешанного POST (и фактически вы можете просто отправить одно тело POST) с типом application/json:

{
   "Title": "Test link topic title",
   "ShortTitle": "Link",
   "Type": 1,
   "TopicType": 3,
   "URL": "http://fqd.url.to.resource.com/",
   "StartDate": null,
   "EndDate": null,
   "IsHidden": false,
   "IsLocked": false
}

Обратите внимание: (a) ваша тема должна иметь короткий заголовок - фактически, блок данных темы имеет те же ограничения в отношении свойств Title и ShortTitle, что и в первом вопросе выше; и (б) вам не нужно предоставлять вторую часть, содержащую только URL.

Чтобы добавить тему, которая является файлом, вы предоставляете тот же блок JSON, что и первая часть вашего многочастного / смешанного тела POST, но (a) TopicType должен иметь значение "1", чтобы указывать, что тема является файлом, (b) свойство URL должно указывать на действительный URL-адрес местоположения в существующем пространстве содержимого модуля org (так серверная служба знает, где хранить файл), и (c) вторая часть POST должна содержать данные файла, Ваше тело POST будет выглядеть примерно так:

POST https://yourlms.edu/d2l/api/le/{ver}/{orgUnitId}/content/modules/{moduleId}/structure/?{auth} HTTP/1.1
Content-type: multipart/mixed; boundary=FOO
Content-length: {length}

--FOO
Content-type: application/json
{
   "Title": "Test file topic title",
   "ShortTitle": "File",
   "Type": 1,
   "TopicType": 1,
   "URL": "http://fqd.url.to.resource.com/",
   "StartDate": null,
   "EndDate": null,
   "IsHidden": false,
   "IsLocked": false
}

--FOO
Content-Disposition: form-data; name=""; filename={filename}
Content-Type: {file's content type}

{binary data}

В настоящее время в справочных документах Valence нет четкого различия между этими двумя типами запросов, и они скоро будут обновлены для этого.

Другие вопросы по тегам