0

Desire2Learn 用の基本的な Valence アプリ ビルドがあり、データを POST しようとすると、400 または 404 エラーが発生します。

/d2l/api/le/(D2LVERSION: version)/(D2LID: orgUnitId)/content/root/ に対して正しい orgUnitId を使用してGET 要求を行うと、コースのすべてのコンテンツを表示できます。ただし、モジュール型の ContentObjectDataをPOSTすると、400 が返されます。ドキュメントには、その特定の要求の 400 エラーについては何も記載されていませんが、ContentObjectData を台無しにしたと想定しています。複数回試しましたが、常に 400 になります。JSON ブロックは次のようになります: { "Title": "API Test", "ShortTitle": "", "Type": 0, "ModuleStartDate": null 、「ModuleEndDate」: null、「IsLocked」: false、「IsHidden」: true }

/d2l/api/le/(D2LVERSION: version)/(D2LID: orgUnitId)/content/modules/(D2LID: moduleId)/structure/ に対して正しい orgUnitId と moduleId を使用してGET要求を行うと、モジュールの内容。タイプ Topic の ContentObjectDataを POSTすると、404 が返されます。Python でこれを行っていますが、サンプル SDK コードが指定されていないため、PHP のものを変換しました。

キー「Url」とそれぞれの値を持つ別の JSON ブロックを使用しています。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 を使用すると、POST だけで 404 になるのはなぜですか? ドキュメント内の 2 つの呼び出しの間で構造が異なるようには見えません。この呼び出しを通常の POST 要求とマルチパートとして試しましたが、どちらも 404 になります。完全な管理者権限を持つ 3 人の異なるユーザーを使用して、これらの呼び出しの両方を試しました。

4

1 に答える 1

2

これは2つの異なる質問のようです。1つはルート/d2l/ api / le / {ver} / {orgUnitId} / content / root /に関するもので、もう1つはルート/ d2l / api / le / {ver} /{orgUnitId}/に関するものです。 content / modules / {moduleId} /structure/。これらに個別に対処しようとします。

ルートモジュールを追加します。最初のルートは、ルートモジュールを組織ユニットのコンテンツリポジトリに追加するために使用されます。ルートには、「Title」プロパティと「ShortTitle」プロパティに関して特別な制限があります。どちらもnullでも空でもない必要があります。さらに、ShortTitleプロパティは、空の文字列に「トリミング」できない形式である必要があります(たとえば、空白しか含まない文字列にすることはできません)。これらの文字列に対するわずかに異なる制限は矛盾として認識されており、より定期的なアプローチが将来のリリースで予定されている可能性があります。新しいルートモジュールにタイトルと短いタイトルを提供する必要があるというアプローチをとれば、安全です。

既存のコンテンツ構造にトピックを追加します。2番目のルートは、組織ユニットのコンテンツリポジトリ内の既存のモジュールの構造に追加するために使用されます。ルートの使用方法は、URLを追加するか、ファイルを追加するかによって異なります。

URLにすぎないトピックを追加するには、マルチパート/混合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のみを含む2番目の部分を提供する必要はありません。

ファイルであるトピックを追加するには、マルチパート/混合POST本文の最初の部分と同様のJSONブロックを提供しますが、(a)トピックがファイルであることを示すためにTopicTypeの値は「1」である必要があります。(b) URLプロパティは、組織ユニットの既存のコンテンツスペース内の有効な場所のURLを指している必要があり(これは、バックエンドサービスがファイルの保存場所を認識する方法です)、(c)POSTの2番目の部分にファイルデータが含まれている必要があります。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リファレンスドキュメントでは、これら2種類のリクエストを明確に区別しておらず、間もなく更新される予定です。

于 2012-05-07T17:39:53.393 に答える