我有一个针对Desire2Learn的基本Valence App构建,现在我正在尝试POST数据,我得到400或404错误。
如果我制作GET request to / d2l / api / le /(D2LVERSION:version)/(D2LID: orgUnitId)/ content / root /,用正确的orgUnitId,我可以看到所有的 课程内容。但是,当我POST时 ContentObjectData 键入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种不同的这两种调用 用户,具有完全管理员权限的用户。
答案 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参考文档没有明确区分这两种请求,并且很快就会更新它们。