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