Web Content API
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

WebコンテンツAPIの詳細設定

Liferay DXP REST サービスを使用すると、サイトの構造化コンテンツを作成および管理できます。 構造化コンテンツとは、Web コンテンツ構造 (または構造) を使用する Web コンテンツ です。 構造は、記事に含まれる著者、概要、コンテンツなどの情報を定義します。 構造により、記事に必要な情報がすべて含まれるようになります。 構造の詳細については、「 Web コンテンツの構造」を参照してください。

構造と構造化コンテンツの詳細を学習するには、いくつかの cURL および Java コードサンプルを含む、事前に構築された Liferay DXP Docker イメージを使用します。

Liferay DXPでのREST APIの使用の概要については RESTサービスの利用 を、WebコンテンツAPIの紹介については WebコンテンツAPIの基礎 を参照してください。

環境のセットアップ

新しいLiferay DXPインスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts

メールアドレス test@liferay.com とパスワード testを使用して、 http://localhost:8080 で Liferay にサインインします。 プロンプトが表示されたら、パスワードを learnに変更します。

次に、 サンプル プロジェクトをダウンロードして解凍します。

curl https://resources.learn.liferay.com/examples/liferay-m7b2.zip -O
unzip liferay-m7b2.zip

これらのスクリプトは基本認証を使用し、テスト用に設計されています。 本番のLiferay DXP環境では、基本認証を使用しないでください。

サイトIDを特定します。

  1. サイト メニュー (Site menu) を開き、 構成を展開して、 サイト設定に移動します。

  2. プラットフォームセクションで、[Site Configuration]をクリックします。

    Liferay DXPバージョン7.3以前の場合は、一般タブをクリックします。

  3. 「サイト ID」の下でサイト識別子を見つけます。

    サイト設定とサイト構成オプションでサイト ID を特定します。

Liferay DXPに画像を追加する

画像を含むさまざまなコンテンツ フィールドを含む記事から始めます。 これらの画像を記事に追加するには、

  1. サイト メニュー (Site menu) を開き、 コンテンツ & データを展開して、 ドキュメントとメディアに移動します。

  2. 新規 をクリックし、 複数ファイルのアップロードを選択します。

  3. foo.pngbar.png、および goo.png の画像を サンプル プロジェクト フォルダ からドロップ領域にドラッグ アンド ドロップします。

  4. 公開をクリックします。

または、 Documents_POST_ToSites.sh スクリプトを使用して、REST API の Document サービスを使用して各画像を個別にアップロードします。

curl \
   "http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/documents" \
   --form "file=@${2}" \
   --header "Content-Type: multipart/form-data" \
   --request "POST" \
   --user "test@liferay.com:learn"

この例では、サイト ID ({1}) と相対画像ファイル パス ({2}) をパラメーターとして使用して、 foo.png 画像を投稿します。

メソッドサービスエンドポイント
GETDocument/v1.0/sites/${1}/documents
./Documents_POST_ToSites.sh "../images/foo.png" 20125
パラメーター #説明
$1siteId
$2ファイルへの相対パス

JSON出力には、idフィールドに画像識別子が含まれます。

{
   ...
   "encodingFormat" : "image/png",
   "externalReferenceCode" : "44339",
   "fileExtension" : "png",
   "id" : 44339,
   ...
   "title" : "foo.png"
}

REST API を使用してドキュメントを操作する方法の詳細については、 ドキュメント API の基礎を参照してください。

または、 Documents_POST_ToSites クラスを使用することもできます。 curl フォルダーから java フォルダーに移動します。 ソースファイルをコンパイルします。

javac -classpath .:* *.java

Documents_POST_ToSites クラスを実行します。 siteId の値をサイト ID に置き換え、 filePath の値を foo.png 画像へのパスに置き換えます。

java -classpath .:* -DfilePath=1234 -DsiteId=5678 Documents_POST_ToSites

サンプルストラクチャーの作成

REST API を使用してプログラムで構造を作成することはできません。

  1. サイト メニュー (Site menu) を開き、 コンテンツ & データを展開して、 Web コンテンツに移動します。

  2. 構造 タブを選択し、 新規をクリックします。

  3. 次の情報を使用して新しい構造を作成します。

    • 名前: フー
    • フィールド(この順序で): テキスト画像日付単一選択
  4. [Single Selection]フィールドには、これらの値を使用します。

    • 第一のオプション値:Foo
    • 第二のオプション値:Goo

    ユーザー インターフェイスに新しい構造を作成します。

  5. 各構造フィールドをクリックし、フィールド参照値を更新します (下の表を参照)。 フィールド参照値は、サイドバーの[Advanced]セクションにあります。

  6. [保存]をクリックします。

項目新規フィールド参照値
テキストボックスTextReference
画像ImageReference
日付DateReference
選択SingleSelectionReference

フィールド参照の値を更新します。

詳細については、「 Web コンテンツ構造の作成」を参照してください。

サンプルテンプレートの作成

REST API を使用してプログラムで Web コンテンツ テンプレートを作成することはできません。

構造体の 画像 フィールドを含むテンプレートを作成します。

  1. サイト メニュー (Site menu) を開き、 コンテンツ & データを展開して、 Web コンテンツに移動します。

  2. テンプレート タブを選択し、 新規をクリックします。

  3. テンプレート名として Foo と入力します。

  4. プロパティサイドパネルから、構造フィールドの横にある 追加 (Add) をクリックします。

    構造フィールドの横にある [追加] をクリックして、テンプレートを構造にリンクします。

  5. 前のセクションから Foo 構造を選択します。

  6. FreeMarkerエディターに含まれるデフォルトの<#-- -->ブロックコメントを削除します。

  7. サイドバーで、 要素Elements)をクリックします。

  8. フィールド グループで、 テキスト画像日付、および 単一選択 フィールドをクリックして、テンプレートに追加します。 FreeMarker エディターで各フィールドが新しい行で始まることを確認します。

    FreeMarker エディターでテンプレート フィールドを編集します。

  9. [保存]をクリックします。

構造体の イメージ フィールドのない 2 番目のテンプレートを作成します。

  1. テンプレートタブで、 アクションActions)をクリックし、 コピーを選択します。

    [アクション] メニューを使用して最初のテンプレートをコピーします。

  2. テンプレートの名前を Goo に更新し、 コピーをクリックします。

  3. [テンプレート]タブで、新規の[Goo]テンプレートをクリックします。

  4. テンプレート エディターで、FreeMarker スクリプトから画像情報 <#if (ImageReference.getData())></#if> を削除します。

  5. [保存]をクリックします。

詳細については、「 Web コンテンツ テンプレートの作成」を参照してください。

サイトからWebコンテンツ構造を取得する

指定されたサイト内の既存の構造をすべて取得するには、 ContentStructures_GET_FromSites.sh スクリプトを使用します。 このスクリプトは、 ContentStructure サービスと GET HTTP メソッドおよび サイト ID パラメータを使用します。

メソッドサービスエンドポイント
GETContentStructure/v1.0/sites/${1}/content-structures
./ContentStructures_GET_FromSites.sh 20125
パラメーター #説明
$1siteId

JSON レスポンスで、構造 id ("id" : 43563) および name ("name" : "Foo") を識別します。 contentStructureFields セクションでは、構造体フィールドについて説明します。 この構造体には、 TextReferenceImageReferenceDateReference、および SingleSelectionReferenceという 4 つの異なるフィールドが含まれています。

{
   "actions" : { },
   "facets" : [ ],
   "items" : [ {
      "availableLanguages" : [ "en-US" ],
      "contentStructureFields" : [ {
         "dataType" : "string",
         "inputControl" : "text",
         "label" : "Text",
         "localizable" : true,
         "multiple" : false,
         "name" : "TextReference",
         "nestedContentStructureFields" : [ ],
         "options" : [ ],
         "predefinedValue" : "",
         "repeatable" : false,
         "required" : false,
         "showLabel" : true
      }, {
         "dataType" : "image",
         "label" : "Image",
         "localizable" : true,
         "multiple" : false,
         "name" : "ImageReference",
         "nestedContentStructureFields" : [ ],
         "options" : [ ],
         "predefinedValue" : "{}",
         "repeatable" : false,
         "required" : false,
         "showLabel" : true
      }, {
         "dataType" : "date",
         "label" : "Date",
         "localizable" : true,
         "multiple" : false,
         "name" : "DateReference",
         "nestedContentStructureFields" : [ ],
         "options" : [ ],
         "predefinedValue" : "",
         "repeatable" : false,
         "required" : false,
         "showLabel" : true
      }, {
         "dataType" : "string",
         "inputControl" : "radio",
         "label" : "Single Selection",
         "localizable" : true,
         "multiple" : false,
         "name" : "SingleSelectionReference",
         "nestedContentStructureFields" : [ ],
         "options" : [ {
         "label" : "Foo",
         "value" : "Option13142925"
         }, {
         "label" : "Goo",
         "value" : "Option50805674"
         } ],
         "predefinedValue" : "[]",
         "repeatable" : false,
         "required" : false,
         "showLabel" : true
      } ],
      "creator" : {
         "additionalName" : "",
         "contentType" : "UserAccount",
         "familyName" : "Bowman",
         "givenName" : "David",
         "id" : 20129,
         "name" : "David Bowman"
      },
      "dateCreated" : "2021-08-25T07:52:46Z",
      "dateModified" : "2021-08-25T08:01:58Z",
      "description" : "",
      "id" : 43563,
      "name" : "Foo",
      "siteId" : 20125
   } ],
   "lastPage" : 1,
   "page" : 1,
   "pageSize" : 20,
   "totalCount" : 1
}

あるいは、 ContentStructures_GET_FromSites Java クラスを実行します。

java -classpath .:* -DsiteId=1234 ContentStructures_GET_FromSites

画像IDを取得する

以前に投稿された画像の ID を取得するには、 Documents_GET_FromSites.sh スクリプトを使用します。 このスクリプトは、 Document サービスと GET HTTP メソッドを使用し、 サイト ID をパラメーターとして使用します。

メソッドサービスエンドポイント
GETDocument/v1.0/sites/${1}/documents
./Documents_GET_FromSites.sh 20125
パラメーター #説明
$1siteId

あるいは、 Documents_GET_FromSites Java クラスを実行します。

java -classpath .:* -DsiteId=1234 Documents_GET_FromSites

サイトからWebコンテンツテンプレートを取得する

ContentTemplates_GET_FromSites スクリプトを使用して、サイトのすべてのテンプレートを取得します。 このスクリプトは、 ContentTemplate サービスと GET HTTP メソッド、および サイト ID をパラメーターとして使用します。

メソッドサービスエンドポイント
GETContentTemplate/v1.0/sites/${1}/content-templates
./ContentTemplates_GET_FromSites.sh 20125
パラメーター #説明
$1siteId

JSONレスポンスには以下が含まれます

  • 2 つのテンプレート: "name": "Foo" および "name": "Goo"

  • 構造をテンプレートにリンクする contentStructureId

  • templateScript には、指定された programmingLanguageで記述されたスクリプトが含まれます。 この例では、FreeMarker が使用されています。

  • Foo テンプレートの templateScript フィールドは、 <#if (ImageReference.getData())></#if>を使用して image フィールドを参照します。 Goo テンプレートにはこの参照は含まれません。

{
   "actions" : {
      "get" : {
         "method" : "GET",
         "href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/20125/content-templates"
      }
   },
   "facets" : [ ],
   "items" : [ {
      "actions" : {
         "get" : {
         "method" : "GET",
         "href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/20125/content-templates/{contentTemplateId}"
         }
      },
      "availableLanguages" : [ "en-US" ],
      "contentStructureId" : 43563,
      "creator" : {
         "additionalName" : "",
         "contentType" : "UserAccount",
         "familyName" : "Bowman",
         "givenName" : "David",
         "id" : 20129,
         "name" : "David Bowman"
      },
      "dateCreated" : "2021-08-25T13:39:20Z",
      "dateModified" : "2021-08-25T13:39:20Z",
      "description" : "",
      "id" : "43823",
      "name" : "Foo",
      "programmingLanguage" : "ftl",
      "siteId" : 20125,
      "templateScript" : "<#if (TextReference.getData())??>\n\t${TextReference.getData()}\n</#if>\n<#if (ImageReference.getData())?? && ImageReference.getData() != \"\">\n\t<img alt=\"${ImageReference.getAttribute(\"alt\")}\" data-fileentryid=\"${ImageReference.getAttribute(\"fileEntryId\")}\" src=\"${ImageReference.getData()}\" />\n</#if>\n<#assign DateReference_Data = getterUtil.getString(DateReference.getData())>\n\n<#if validator.isNotNull(DateReference_Data)>\n\t<#assign DateReference_DateObj = dateUtil.parseDate(\"yyyy-MM-dd\", DateReference_Data, locale)>\n\n\t${dateUtil.getDate(DateReference_DateObj, \"dd MMM yyyy - HH:mm:ss\", locale)}\n</#if>\n<#if (SingleSelectionReference.getData())??>\n\t${SingleSelectionReference.getData()}\n</#if>"
   }, {
      "actions" : {
         "get" : {
         "method" : "GET",
         "href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/20125/content-templates/{contentTemplateId}"
         }
      },
      "availableLanguages" : [ "en-US" ],
      "contentStructureId" : 43563,
      "creator" : {
         "additionalName" : "",
         "contentType" : "UserAccount",
         "familyName" : "Bowman",
         "givenName" : "David",
         "id" : 20129,
         "name" : "David Bowman"
      },
      "dateCreated" : "2021-08-26T10:10:22Z",
      "dateModified" : "2021-08-26T14:08:53Z",
      "description" : "",
      "id" : "44177",
      "name" : "Goo",
      "programmingLanguage" : "ftl",
      "siteId" : 20125,
      "templateScript" : "<#if (TextReference.getData())??>\n\t${TextReference.getData()}\n</#if>\n<#assign DateReference_Data = getterUtil.getString(DateReference.getData())>\n\n<#if validator.isNotNull(DateReference_Data)>\n\t<#assign DateReference_DateObj = dateUtil.parseDate(\"yyyy-MM-dd\", DateReference_Data, locale)>\n\n\t${dateUtil.getDate(DateReference_DateObj, \"dd MMM yyyy - HH:mm:ss\", locale)}\n</#if>\n<#if (SingleSelectionReference.getData())??>\n\t${SingleSelectionReference.getData()}\n</#if>"
   } ],
   "lastPage" : 1,
   "page" : 1,
   "pageSize" : 20,
   "totalCount" : 2
}

あるいは、 ContentTemplates_GET_FromSites Java クラスを実行します。

java -classpath .:* -DsiteId=1234 ContentTemplates_GET_FromSites

Webコンテンツテンプレートの取得

特定のテンプレートの情報を取得するには、サイト ID とテンプレート ID を必要とする ContentTemplates_GET_ById.sh cURL スクリプトを使用します。

メソッドサービスエンドポイント
GETContentTemplate/v1.0/sites/${1}/content-templates/${2}
./ContentTemplates_GET_ById.sh 20125 43823
パラメーター #説明
$1siteId
$2contentTemplateId

あるいは、 ContentTemplates_GET_ById Java クラスを実行します。 値をサイト ID とテンプレート ID に置き換えます。

java -classpath .:* -DcontentTemplateId=1234 -DsiteId=5678 ContentTemplates_GET_ById

Webコンテンツ記事の投稿

StructuredContents_POST_ToSites.sh cURL スクリプトを使用して、 POST HTTP メソッドと、作成した サンプル構造を使用して新しい記事を作成します。 このスクリプトは、サイトID、構造体ID、foo.pngの 画像IDをパラメータとして必要とする。

メソッドサービスエンドポイント
PUTStructuredContent/v1.0/sites/{siteId}/structured-contents
./StructuredContents_POST_ToSites.sh 20125 43563 43795

cURLスクリプトのパラメーター:

パラメーター #説明
$1siteId
$2imageId
$3contentStructureId

Liferay DXPで新しい記事を見つけるには、 サイトメニューSite menu)→ コンテンツ & データWebコンテンツを開きます。

POST HTTP メソッドからの記事が UI に表示されます。

スクリプトは次の属性を持つ新しい記事を投稿します。

  • "title" : "Able"
  • 記事の本文を定義している下記4つのcontentFieldsの値
    • TextReference内の文字列。
    • ImageReference内の画像。
    • DateReference内の日付情報。
    • SingleSelectionReference内のラジオボタンコントロール。
{
   "actions" : {
      ...
   },
   "availableLanguages" : [ "en-US" ],
   "contentFields" : [ {
      "contentFieldValue" : {
         "data" : "This text describes Foo."
      },
      "dataType" : "string",
      "inputControl" : "text",
      "label" : "Text",
      "name" : "TextReference",
      "nestedContentFields" : [ ],
      "repeatable" : false
   }, {
      "contentFieldValue" : {
         "image" : {
         "contentType" : "Document",
         "contentUrl" : "/documents/20125/0/foo.png/50956e56-9571-8f73-ae6e-9fca20fe0e3a?t=1629897455431",
         "description" : "This text describes Foo's image.",
         "encodingFormat" : "image/png",
         "fileExtension" : "png",
         "id" : 43795,
         "sizeInBytes" : 6232,
         "title" : "Foo"
         }
      },
      "dataType" : "image",
      "label" : "Image",
      "name" : "ImageReference",
      "nestedContentFields" : [ ],
      "repeatable" : false
   }, {
      "contentFieldValue" : {
         "data" : "2021-08-30T00:00:00Z"
      },
      "dataType" : "date",
      "label" : "Date",
      "name" : "DateReference",
      "nestedContentFields" : [ ],
      "repeatable" : false
   }, {
      "contentFieldValue" : {
         "data" : "Foo"
      },
      "dataType" : "string",
      "inputControl" : "radio",
      "label" : "Single Selection",
      "name" : "SingleSelectionReference",
      "nestedContentFields" : [ ],
      "repeatable" : false
   } ],
   "contentStructureId" : 43563,
   "creator" : {
      "additionalName" : "",
      "contentType" : "UserAccount",
      "familyName" : "Bowman",
      "givenName" : "David",
      "id" : 20129,
      "name" : "David Bowman"
   },
   "customFields" : [ ],
   "dateCreated" : "2021-08-26T06:14:06Z",
   "dateModified" : "2021-08-26T06:14:06Z",
   "datePublished" : "2021-08-26T06:14:00Z",
   "description" : "",
   "externalReferenceCode" : "43847",
   "friendlyUrlPath" : "able",
   "id" : 43849,
   "key" : "43847",
   "keywords" : [ ],
   "numberOfComments" : 0,
   "relatedContents" : [ ],
   "renderedContents" : [ {
      "contentTemplateId" : "43823",
      "contentTemplateName" : "Foo",
      "markedAsDefault" : true,
      "renderedContentURL" : "http://localhost:8080/o/headless-delivery/v1.0/structured-contents/43849/rendered-content/43823"
   }, {
      "contentTemplateId" : "43868",
      "contentTemplateName" : "Goo",
      "markedAsDefault" : false,
      "renderedContentURL" : "http://localhost:8080/o/headless-delivery/v1.0/structured-contents/44060/rendered-content/43868"
   } ],
   "siteId" : 20125,
   "subscribed" : false,
   "taxonomyCategoryBriefs" : [ ],
   "title" : "Able",
   "uuid" : "01ace059-814a-132d-d46d-21737ef2ec53"
}

あるいは、 StructuredContents_POST_ToSites Java クラスを実行します。 値を構造、サイト、およびイメージ ID に置き換えます。

java -classpath .:* -DcontentStructureId=1234 -DimageId=5678 -DsiteId=91011 StructuredContents_POST_ToSites

特定のテンプレートでWebコンテンツ記事をレンダリングする

記事は特定のテンプレートにリンクされていません。 テンプレートは記事のレンダリング方法を定義します。 同じ記事に異なるテンプレートを使用できます。 詳細については、「 Web コンテンツの構造」を参照してください。

ヒント

記事は特定のテンプレートにリンクされていないため、新しい記事を POST するときにテンプレートを指定することはできません (HTTP POST メソッドは、テンプレートを記述する renderedContents セクションを無視します)。

選択した記事とテンプレートを使用して記事をレンダリングするには、 ./StructureContents_GET_RenderedContent_ById.sh スクリプトを使用します。 このスクリプトでは、GETHTTPメソッドを StructuredContentサービスで使用します。

メソッドサービスエンドポイント
PUTStructuredContent/v1.0/structured-contents/${1}/rendered-content/${2}
./StructureContents_GET_RenderedContent_ById.sh 43849 43868

以下は、 画像 フィールドを含むテンプレートを使用したスクリプト出力です。

Foo<picture data-fileentryid="43795"><source media="(max-width:300px)" srcset="http://localhost:8080/o/adaptive-media/image/43795/Thumbnail-300x300/foo.png?t=1629897455431, /o/adaptive-media/image/43795/Preview-1000x0/foo.png?t=1629897455431 2x" /><source media="(max-width:600px) and (min-width:300px)" srcset="http://localhost:8080/o/adaptive-media/image/43795/Preview-1000x0/foo.png?t=1629897455431" /><img alt="Foo alt-image description" data-fileentryid="43795" src="http://localhost:8080/documents/20125/0/foo.png/50956e56-9571-8f73-ae6e-9fca20fe0e3a?t=1629897455431" /></picture>30 Aug 2021 - 00:00:00Option1314292

イメージ フィールドなしでテンプレートを指定した場合、 <picture></picture> 情報は出力に表示されません。 画像 フィールドなしでテンプレートを使用した場合のスクリプト出力は次のとおりです。

./StructureContents_GET_RenderedContent_ById.sh 43849 43823
Foo30 Aug 2021 - 00:00:00Option13142925

cURLスクリプトのパラメーター:

パラメーター #説明
$1structuredContentId
$2contentTemplateId

あるいは、 StructureContents_GET_RenderedContent_ById Java クラスを実行します。 値を記事とテンプレートの ID に置き換えます。

java -classpath .:* -DcontentTemplateId=1234 -DstructuredContentId=5678 StructureContents_GET_RenderedContent_ById

Webコンテンツ記事のパッチ適用

PATCH HTTP メソッドを StructuredContent サービスと共に使用して、元の記事情報を部分的に更新します。 StructuredContents_PATCH_ById スクリプトは、記事と構造の識別子を使用して、記事のタイトルを Charlieに置き換えます。

メソッドサービスエンドポイント
PATCHStructuredContent/v1.0/structured-contents/{structuredContentId}
./StructuredContents_PATCH_ById.sh 43849 43563

cURLスクリプトのパラメーター:

パラメーター #説明
$1structuredContentId
$2contentStructureId

あるいは、 StructuredContents_PATCH_ById Java クラスを実行します。 値を記事 ID に置き換えます。

java -classpath .:* -DstructuredContentId=1234 StructuredContents_PATCH_ById

ウェブコンテンツ記事の掲載

元の記事情報を置き換えるには、 PUT HTTP メソッドを StructuredContent サービスと共に使用します。 StructuredContents_PUT_ById スクリプトは、記事と構造の識別子を使用して、記事の名前を Baker に置き換え、記事の内容を Bar から Gooに置き換えます。

メソッドサービスエンドポイント
PUTStructuredContent/v1.0/structured-contents/{structuredContentId}
./StructuredContents_PUT_ById.sh 43849 43563 43805

cURLスクリプトのパラメーター:

パラメーター #説明
$1structuredContentId
$2imageId
$3contentStructureId

あるいは、 StructuredContents_PUT_ById Java クラスを実行します。 値を記事、画像、構造の ID に置き換えます。

java -classpath .:* -DcontentStructureId=1234 -DimageId=5678 -DstructuredContentId=91011 StructuredContents_PUT_ById