GraphQLを使用したWebコンテンツAPIの基本
Liferay DXP GraphQLサービスを使用すると、サイト上の構造化コンテンツの作成、取得、更新、削除を行うことで、Webコンテンツを管理できます。 構造化コンテンツとは、定義された構造に従い、記事間の一貫性を確保したウェブコンテンツ記事のこと。
Web コンテンツ テンプレート を使用して構造化コンテンツをレンダリングすることはできますが、構造化コンテンツを作成するためにテンプレートは必須ではありません。
より高度な例については、 高度な Web コンテンツ API を参照してください。 Liferay DXP で GraphQL を使い始めるには、 GraphQL API の利用 を参照してください。
環境のセットアップ
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、以下の手順に従います。
-
Web Content API の基本 ファイルをダウンロードして解凍します。
curl https://resources.learn.liferay.com/examples/liferay-r4h9.zip -Ounzip liferay-r4h9.zip注これらのスクリプトは基本認証を使用し、テスト用に設計されています。 本番のLiferay DXP環境では、基本認証を使用しないでください。
-
以下の手順で環境をセットアップします。
利用するサービスを特定する
Liferay DXP Headless Delivery API の以下のサービスを使用して、Web コンテンツを管理します。
記事用の構造化コンテンツ。構造のためのコンテンツ構造。- テンプレート用の
ContentTemplate。
これらの API の詳細情報を表示するには、ブラウザを使用して Liferay API Explorer にアクセスしてください。 [server]:[port]/o/api (例: http://localhost:8080/o/api)。 詳細については、 REST サービスの利用 をお読みください。
サイトIDの特定
ログインすると、 はサイト ID を取得します。 このIDを複数のサービス呼び出しで使用してください。 この例では、ID は 20117 です。
ユーザーインターフェースでWebコンテンツ構造を作成する
記事を作成するには、構成が必要です。 ユーザーインターフェースで構造を指定せずに記事を作成すると、Liferay DXPはデフォルトの基本Webコンテンツ構造を使用します。
Liferay DXPのユーザーインターフェースでは、基本Webコンテンツ構造は表示されません。
基本ウェブコンテンツ構造を使用する代わりに、新しい構造を作成します。
-
サイトメニュー (../../../images/icon-menu.png) を開き、 コンテンツ & データを展開し、 Web コンテンツ に移動します。
-
構造 タブを選択し、 新規をクリックします。
-
名前は Foo 構造 です。 右側のビルダーメニューで、 テキスト フィールドを選択し、フォーム領域にドラッグしてドロップします。
-
右側に開いたコンテキストメニューで、 詳細 タブを選択し、 フィールド参照 を
コンテンツに変更します。 -
[保存]をクリックします。
詳細については、 構造の作成 を参照してください。
ユーザーインターフェースでWebコンテンツ記事を作成する
これで、Foo構造に基づいて記事を作成できます。
-
サイトメニュー (../../../images/icon-menu.png) を開き、 コンテンツ & データを展開し、 Web コンテンツ に移動します。
-
Webコンテンツ タブで、 新規 をクリックし、 Foo構造 を選択します。
-
新しい名前として Foo Article と入力し、 公開 をクリックします。
詳細については、 Web コンテンツ記事の作成 を参照してください。
サイトからウェブコンテンツ記事を取得する
GraphQLサービスを使用して、サイトの記事一覧を取得します。 この操作を実行するには、Liferay API Explorerにアクセスしてください。
-
Liferay API Explorer へ移動します。
http://[host]:[port]/o/api。 -
画面右上の GraphQL をクリックして、Liferay の GraphiQL ブラウザを開きます。

-
左側の列に次のクエリを追加し、
siteKeyをサイト ID に置き換えて、id、key、title、friendlyUrlPath、およびcontentStructureId を取得します。指定されたサイトの記事について:query { headlessDelivery_v1_0{ structuredContents(siteKey: "20117") { items { id key title friendlyUrlPath contentStructureId } } } }注GraphQLを使用すると、クエリ応答に必要なフィールドを指定できます。 これらの例に示されているクエリ/ミューテーションは、要件に合わせてフィールドを追加または削除することで調整できます。
-
をクリックしてクエリを実行 をクリックします。 応答には、各項目の下に照会された情報が記載された記事項目のリストが含まれます。
{ "data": { "structuredContents": { "items": [ { "id": 32147, "key": "32145", "title": "Foo", "friendlyUrlPath": "foo", "contentStructureId": 32122 } ] } } }
以下に、他のGraphQLサービスを呼び出す例を示します。
ウェブコンテンツ記事の入手
前のステップのスクリプトは、サイトのすべての記事を返しますが、structuredContent(structuredContentId)クエリーを使い、記事のIDを指定することで、特定の記事を取得することができます。
-
右上隅の GraphQL をクリックし、左列に次のクエリを追加し、
structuredContentIdを構造 ID に置き換えて、id、title、friendlyUrlPath、およびcontentStructureId に関する情報を取得します。:query { headlessDelivery_v1_0{ structuredContent(structuredContentId: 32147) { id title friendlyUrlPath contentStructureId } } } -
をクリックしてクエリを実行 をクリックします。 応答には、構造項目の照会情報が含まれます。
{ "data": { "structuredContent": { "id": 32147, "title": "Foo", "friendlyUrlPath": "foo", "contentStructureId": 32122 } } }
サイトからウェブコンテンツ構造を取得する
サイトの構造のリストを取得するには、 contentStructures クエリを使用します。
-
右上隅の GraphQL をクリックし、左側の列に次のクエリを追加し、
siteKeyをサイト ID に置き換えます。query{ headlessDelivery_v1_0 { contentStructures(siteKey: "20117") { items { id name contentStructureFields { name label dataType } } } } } -
をクリックしてクエリを実行 をクリックします。 レスポンスでは、クエリで指定された内容が返されます。
{ "data": { "headlessDelivery_v1_0": { "contentStructures": { "items": [ { "id": 32122, "name": "Foo", "contentStructureFields": [ { "name": "content", "label": "Text", "dataType": "string" } ] } ] } } } }
ウェブコンテンツ構造の取得
パラメータとして特定の構造のIDを指定することで、 contentStructure クエリを使用して、その構造の説明を取得します。
-
右上隅の GraphQL をクリックし、左列に次のミューテーションを追加し、
siteKeyをサイト ID に、contentStructureIdを、使用したい構造の ID に置き換えます。query{ headlessDelivery_v1_0{ contentStructure(contentStructureId: 32122){ id name contentStructureFields{ name label dataType } } } } -
をクリックしてクエリを実行 をクリックします。 レスポンスでは、クエリで指定された内容が返されます。
{ "data": { "headlessDelivery_v1_0": { "contentStructure": { "id": 32122, "name": "Foo" "contentStructureFields": [ { "name": "content", "label": "Text", "dataType": "string" } ] } } } }
ウェブコンテンツ記事の投稿
createSiteStructuredContent ミューテーションを使用して、Foo 構造を使用して新しい記事を作成します。
-
右上隅の GraphQL をクリックし、左列に次のミューテーションを追加し、
siteKeyをサイト ID に、contentStructureIdを、使用したい構造の ID に置き換えます。mutation { headlessDelivery_v1_0{ createSiteStructuredContent( siteKey: "20117", structuredContent: { contentFields: [ { name: "content", contentFieldValue: { data: "Goo" } } ], contentStructureId: 32122, title: "Goo Article" } ) { id title contentFields { name contentFieldValue { data } } } } } -
をクリックしてクエリを実行 をクリックします。 応答では、変異によって通知された内容が返されます。
{ "data": { "createSiteStructuredContent": { "id": 32205, "title": "Goo Article", "contentFields": [ { "name": "content", "contentFieldValue": { "data": "Goo" } } ] } } }
ウェブコンテンツ記事の修正
patchStructuredContent ミューテーションを使用して記事を更新します。 これは、構造化コンテンツ id を使用して、記事のコンテンツを ‘Goo' から ‘Foo' に更新します。
-
右上隅の GraphQL をクリックし、左列に次の変更を追加し、
structuredContentIdを記事 ID に、contentStructureIdを、使用したい構造の ID に置き換えます。mutation { headlessDelivery_v1_0{ patchStructuredContent( structuredContentId: 32215, structuredContent: { contentStructureId: 32122, title: "Updated Goo Article" contentFields: [ { name: "content", contentFieldValue: { data: "Foo" } } ] } ) { id title contentFields { name contentFieldValue { data } } } } } -
をクリックしてクエリを実行 をクリックします。 応答では、変異によって通知された内容が返されます。
{ "data": { "patchStructuredContent": { "id": 32215, "title": "Updated Goo Article", "contentFields": [ { "name": "content", "contentFieldValue": { "data": "Foo" } } ] } } }
ウェブコンテンツ記事を掲載する
updateStructuredContent ミューテーションを使用して、元の記事の情報を置き換えます。 これは、記事と構造の識別子を使用して、記事の名前と記事の内容を Foo から Bar に置き換えます。
-
右上隅の GraphQL をクリックし、左列に次の変更を追加し、
structuredContentIdを記事 ID に、contentStructureIdを、使用したい構造の ID に置き換えます。mutation { headlessDelivery_v1_0{ updateStructuredContent( structuredContentId: 32215, structuredContent: { contentStructureId: 32122, title: "Bar Article" contentFields: [ { name: "content", contentFieldValue: { data: "Bar" } } ] } ) { id title contentFields { name contentFieldValue { data } } } } } -
をクリックしてクエリを実行 をクリックします。 応答では、変異によって通知された内容が返されます。
{ "data": { "updateStructuredContent": { "id": 32215, "title": "Bar Article", "contentFields": [ { "name": "content", "contentFieldValue": { "data": "Bar" } } ] } } }
ウェブコンテンツ記事の削除
deleteStructuredContent ミューテーションを使用して記事を削除します。 記事の ID を使用して削除します。
GraphQLの変異を使用して記事を削除すると、Liferay DXPのごみ箱を使用せずに永久に削除されます。
-
右上隅の GraphQL をクリックし、左列に次のミューテーションを追加し、
structuredContentIdを次の記事に置き換えます。mutation { headlessDelivery_v1_0{ deleteStructuredContent(structuredContentId: 32215) } } -
をクリックしてクエリを実行 をクリックします。 レスポンスには、削除ステータスを示す値が返されます。
{ "data": { "deleteStructuredContent": true } }
その他のWebコンテンツとWebコンテンツフォルダーのサービス
以下のクエリ/ミューテーションを使用して、 StructuredContent および StructuredContentFolder サービスをさらに利用します。
| ファイル | Description |
|---|---|
HeadlessDelivery_v1_0.structuredContentFolders: StructuredContentFolderPage | サイトのウェブコンテンツフォルダを一覧表示します。 |
HeadlessDelivery_v1_0.structuredContentFolder: StructuredContentFolder | 特定のウェブコンテンツフォルダの詳細を取得します。 |
MutationHeadlessDelivery_v1_0.createSiteStructuredContentFolder: StructuredContentFolder | サイトに新しいウェブコンテンツフォルダを追加します。 |
MutationHeadlessDelivery_v1_0.createStructuredContentFolderStructuredContentFolder: StructuredContentFolder | 既存のフォルダに新しいウェブコンテンツフォルダを追加します |
MutationHeadlessDelivery_v1_0.patchStructuredContentFolder: StructuredContentFolder | ウェブコンテンツフォルダ内の特定のフィールドを更新します。 |
MutationHeadlessDelivery_v1_0.updateStructuredContentFolder: StructuredContentFolder | ウェブコンテンツフォルダを新しいデータに置き換えます。 |
MutationHeadlessDelivery_v1_0.deleteStructuredContentFolder: Boolean | ウェブコンテンツフォルダを削除します。 |
MutationHeadlessDelivery_v1_0.createStructuredContentFolderStructuredContent: StructuredContent | 既存のフォルダに新しいウェブコンテンツ記事を追加します。 |
GraphQL ミューテーションを使用して Web コンテンツ フォルダーを削除すると、 Liferay DXP ごみ箱 を使用せずにフォルダーとそのコンテンツが完全に削除されます。
これらのエンドポイントを使用するには、
-
クエリ/ミューテーション名を特定します。
HeadlessDelivery_v1_0.structuredContentFolder では、StructuredContentFolder、HeadlessDelivery_V1_0は名前空間、structuredContentFolderはクエリの名前、StructuredContentFolderは返される型です。MutationHeadlessDelivery_v1_0.deleteStructuredContentFolder: Boolean、Mutationは、これがミューテーションであることを示しています。 -
GraphQL構文でクエリ/ミューテーションを使用します(1)。
HeadlessDelivery_v1_0.structuredContentFolder: StructuredContentFolderの場合、クエリは次のようになります。query { headlessDelivery_v1_0{ structuredContentFolder(structuredContentFolderId: 32344){ } } }GraphQLスキーマエクスプローラー(3)を使用して、どの引数を使用するかを理解してください。
-
戻り値のフィールドを指定してください。
query { headlessDelivery_v1_0{ structuredContentFolder(structuredContentFolderId: 32344){ id name creator { id name } dateCreated } } } -
クエリの実行 をクリックしてクエリ/ミューテーションを実行します。 応答(2)は、要求されたフィールドを返す必要があります。
{ "data": { "headlessDelivery_v1_0": { "structuredContentFolder": { "id": 32344, "name": "folder", "creator": { "id": 20123, "name": "Portal Administrator" }, "dateCreated": "2024-11-05T12:20:56Z" } } } }