404将内容发布到Desire2Learn

时间:2012-05-07 15:26:05

标签: desire2learn

我有一个针对Desire2Learn的基本Valence App构建,现在我正在尝试POST数据,我得到400或404错误。

如果我制作GET request to / d2l / api / le /(D2LVERSION:version)/(D2LID: orgUnitId)/ content / root /,用正确的orgUnitId,我可以看到所有的 课程内容。但是,当我POSTContentObjectData 键入Module,它返回400.文档没有列出400的任何内容 该特定请求的错误,但我假设我搞砸了 ContentObjectData。我已经尝试了多次,但它总会产生一个 400. JSON块看起来像这样: {     “标题”:“API测试”,     “ShortTitle”:“”,     “类型”:0,     “ModuleStartDate”:null,     “ModuleEndDate”:null,     “IsLocked”:假,     “IsHidden”:是的 }

如果我发出GET请求 to / d2l / api / le /(D2LVERSION:version)/(D2LID: orgUnitId)/ content / modules /(D2LID:moduleId)/ structure /,正确无误 orgUnitId和moduleId,我可以看到模块的内容。当我 POST a 类型为Topic的ContentObjectData,它返回404.我正在这样做 Python,没有给出示例SDK代码,所以我转换了PHP 一。

我一直在使用另一个JSON 使用键'Url'然后阻止相应的值。这是完全的 编码的多部分身体我一直在尝试POST:

    --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请求并作为multipart, 但两者都产生了404.我尝试了使用3种不同的这两种调用 用户,具有完全管理员权限的用户。

1 个答案:

答案 0 :(得分:2)

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

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

将主题添加到现有内容结构。第二条路径用于添加到组织单位内容存储库中的现有模块结构。您使用路线的方式取决于您是要添加URL还是要添加文件。

要添加一个仅仅是URL的主题,您只需要提供带有application / json类型的multipart / mixed POST的第一部分(实际上,您只需发送一个POST主体):

{
   "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的第二部分。

要添加作为文件的主题,您提供与multipart / mixed POST正文的第一部分类似的JSON块,但是(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参考文档没有明确区分这两种请求,并且很快就会更新它们。