0

我为 Desire2Learn 构建了一个基本的 Valence 应用程序,现在我正在尝试发布数据,但我收到 400 或 404 错误。

如果我 使用正确的 orgUnitId 向 /d2l/api/le/(D2LVERSION: version)/(D2LID: orgUnitId)/content/root/发出GET 请求,我可以看到课程的所有内容。但是,当我发布模块类型的 ContentObjectData时,它返回 400。文档没有列出该特定请求的 400 错误,但我假设我搞砸了 ContentObjectData。我已经尝试了多次,但总是导致 400。 JSON 块如下所示: { "Title": "API Test", "ShortTitle": "", "Type": 0, "ModuleStartDate": null , "ModuleEndDate": null, "IsLocked": false, "IsHidden": true }

如果我使用正确的 orgUnitId 和 moduleId 向 /d2l/api/le/(D2LVERSION: version)/(D2LID: orgUnitId)/content/modules/(D2LID: moduleId)/structure/发出GET请求,我可以看到模块的内容。当我 发布 Topic 类型的ContentObjectData时,它返回 404。我在 Python 中执行此操作,没有给出示例 SDK 代码,因此我转换了 PHP 代码。

我一直在使用另一个带有键“Url”的 JSON 块,然后是相应的值。这是我一直在尝试发布的完全编码的多部分正文:

    --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--

为什么 GET 和 POST 的相同 URI 会导致 404 仅用于 POST?文档中的两个调用之间的结构看起来没有任何不同。我将此调用作为普通的 POST 请求和多部分进行了尝试,但都导致 404。我已经使用 3 个不同的用户尝试了这两个调用,其中一个具有完全的管理员权限。

4

1 回答 1

2

这似乎是两个不同的问题,一个关于路线/d2l/api/le/{ver}/{orgUnitId}/content/root/和一个关于路线/d2l/api/le/{ver}/{orgUnitId}/内容/模块/{moduleId}/结构/。我将尝试分别解决这些问题:

添加根模块。第一个路由用于将路由模块添加到组织单位的内容存储库。路由对“Title”和“ShortTitle”属性有特殊限制:两者都必须非空且非空。此外,ShortTitle 属性必须采用不能“修剪”为空字符串的形式(例如,它不能是只包含空格的字符串)。这些字符串的略有不同的限制已被认为是不一致的,并且在未来的版本中可能会出现更常规的方法。如果您采用必须为新根模块提供标题和短标题的方法,您是安全的。

向现有内容结构添加主题。第二条路线用于添加到组织单位内容存储库中的现有模块结构。您使用路由的方式会有所不同,具体取决于您是要添加 URL 还是要添加文件。

要添加仅是 URL 的主题,您只需提供 multipart/mixed 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 属性的限制与上面第一个问题相同;并且,(b) 您不需要提供仅包含 URL 的第二部分。

要添加作为文件的主题,您需要提供一个类似的 JSON 块作为多部分/混合 POST 正文的第一部分,但是 (a) TopicType 应该具有值“1”以指示主题是文件,(b) URL 属性应指向组织单位现有内容空间内的有效位置 URL(这是后端服务知道将文件存储在何处的方式),并且 (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 参考文档并没有明确区分这两种请求,很快就会更新。

于 2012-05-07T17:39:53.393 回答