通知APIの基礎
Liferay のヘッドレス配信アプリケーションは、複数のデフォルト アプリケーションにわたるプラットフォーム イベントの通知をサブスクライブまたはサブスクライブ解除するための REST および GraphQL サービスを提供します。 cURL コマンドや Java クラスなどのメソッドを使用してこれらのサービスにアクセスします。
ブログ、ドキュメント フォルダー、ナレッジ ベース記事、メッセージ ボード メッセージ、メッセージ ボード セクション、メッセージ ボード スレッド、構造化コンテンツ フォルダー、構造化コンテンツ、Wiki ノード、および Wiki ページなどのアプリケーションの通知は、 headless-delivery 名前空間で管理できます。
まず環境を設定し、必要な情報を収集します。
環境の設定
新しい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に変更します。
サインインすると、 サイト IDを取得します。 この ID を複数のサービス呼び出しで使用します。 この例では、IDは 20117です。
次に、以下の手順に従います。
-
サンプルプロジェクトをダウンロードして解凍します。
curl https://resources.learn.liferay.com/examples/liferay-v3g2.zip -Ounzip liferay-v3g2.zip -
Subscriptions_GET_FromMyUserAccount.shスクリプトを実行して、ユーザー アカウントでアクティブなサブスクリプションを確認します。./Subscriptions_GET_FromMyUserAccount.shアクティブなサブスクリプションがないため、応答は空になります。
{ "actions": {}, "facets": [], "items": [], "lastPage": 1, "page": 1, "pageSize": 20, "totalCount": 0 }重要--userオプションで指定されたメールアドレスとパスワードが、スクリプトで使用されているものと一致していることを確認します。
通知の購読
headless-delivery 名前空間の下にあるさまざまなアプリケーションの通知をサブスクライブします。
サブスクリプション可能なアプリケーションを見つけるには、[server]:[port]/o/api (例: http://localhost:8080/o/api) にある Liferay API Explorer を使用します。
API エクスプローラーで、 REST アプリケーション をクリックし、 headless-delivery/v1.0 オプションを選択します。
エンドポイント パスに subscribe または unsubscribe が含まれる PUT メソッドを探します。 たとえば、ブログ投稿のサブスクリプションアクションの場合は、 /v1.0/sites/{siteId}/blog-postings/subscribe のようなエンドポイントがあります。

RESTサービスの使用
REST API を使用して、 BlogPostings_PUT_Subscribe_ToSites.sh スクリプトでアプリケーションをサブスクライブします。 このスクリプトは、サイト上のブログ投稿に関する通知をサブスクライブします。
curl \
"http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/blog-postings/subscribe" \
--header "Content-Type: application/json" \
--request "PUT" \
--user "test@liferay.com:learn"
他のアプリケーションをサブスクライブするにはエンドポイント パスを変更します。 たとえば、ドキュメント フォルダーからの通知をサブスクライブするには、 http://localhost:8080/o/headless-delivery/v1.0/document-folders/{documentFolderId}/subscribeを使用します。 API エクスプローラーでは、利用可能なエンドポイントとその要件に関する詳細情報が提供されます。
-
コマンドラインで、
curlフォルダに移動します。 サイト ID をパラメータとしてBlogPostings_PUT_Subscribe_ToSites.shを実行します。BlogPostings_PUT_Subscribe_ToSites.sh [site-ID] -
この呼び出しは出力を返しません。
Subscriptions_GET_FromMyUserAccount.shを実行してサブスクリプションを確認します。 結果には、サブスクリプションのcontentTypeとidが含まれます。{ "actions" : { }, "facets" : [ ], "items" : [ { "contentId" : 20117, "contentType" : "BlogPosting", "dateCreated" : "2024-09-09T21:56:12Z", "dateModified" : "2024-09-09T21:56:12Z", "frequency" : "instant", "id" : 32471, "siteId" : 20117 } ], "lastPage" : 1, "page" : 1, "pageSize" : 20, "totalCount" : 1 } -
RESTサービスは、Javaクラスで呼び出すこともできます。
curlフォルダから、javaフォルダに移動します。 ソースファイルをコンパイルします。javac -classpath .:* *.java -
BlogPostings_PUT_Subscribe_ToSitesJava クラスを実行します。siteIdの値をサイト ID に置き換えます。
java -classpath .:* -DsiteId=1234 BlogPostings_PUT_Subscribe_ToSites
他のアプリケーションをサブスクライブするには、対象アプリケーションに対応するクラスを識別します。 たとえば、ドキュメント フォルダーの場合は DocumentFolderResource を使用します。 新しいリソースの正しいサブスクリプション メソッドと一致するようにメソッド呼び出しを更新します。
Subscriptions_GET_FromMyUserAccountクラスを実行して、アクションが成功したことを確認します。
{"actions": {}, "items": [{"contentId": "20117", "contentType": "BlogPosting", "dateCreated": "2024-09-10T09:53:32-0300", "dateModified": "2024-09-10T09:53:32-0300", "frequency": "instant", "id": 32471, "siteId": 20117}], "page": 1, "pageSize": 10, "totalCount": 1}
cURLコマンドの検証
BlogPostings_PUT_Subscribe_ToSites.sh スクリプトは、 ヘッドレス配信 アプリケーション REST サービスを呼び出して、特定のサイトのブログ投稿に関する通知をサブスクライブします。
ここでは、コマンドの引数を紹介します。
| 引数 | 説明 |
|---|---|
"http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/blog-postings/subscribe" | RESTサービスエンドポイント。 サイトIDのパラメーターが${1}に置き換わります。 |
--header "Content-Type: application/json" \ | サーバーに送信されたリソースのメディア タイプ (MIME タイプ) は JSON です。 |
--request "PUT" | 指定されたエンドポイントで呼び出すHTTPメソッド。 |
--user "test@liferay.com:learn" | 基本認証の資格情報。 |
ここでは、デモのために基本的な認証を使用しています。 本番環境では、 OAuth 2.0経由でユーザーを認証する必要があります。 OAuth2 を使用するサンプル React アプリケーションについては、 OAuth2 を使用してユーザーを承認する を参照してください。
Javaクラスを調べる
BlogPostings_PUT_Subscribe_ToSites.java クラスは、特定のサイトのブログ投稿に関する通知をサブスクライブします。
| 行(省略形) | 説明 |
|---|---|
BlogPostingResource.Builder builder = ... | Builderを取得し、BlogPostingResourceサービスインスタンスを生成します。 |
BlogPostingResource blogPostingResource = builder.authentication(...).build(); | 基本認証を指定し、BlogPostingResourceサービスインスタンスを生成します。 |
blogPostingResource.putSiteBlogPostingSubscribe(...); | blogPostingResource.putSiteBlogPostingSubscribe メソッドを呼び出し、サイト ID を渡します。 |
プロジェクトには、依存関係としてcom.liferay.headless.delivery.client.jarファイルが含まれていることに注意してください。 すべてのRESTアプリケーションのクライアントJAR依存関係情報は、/o/apiでインストール先のAPIエクスプローラーで確認できます。
サービスの詳細については、 BlogPostingResource を参照してください。
GraphQL サービスの使用
通知用の GraphQL サービスは、REST のサービスと同様に動作します。 このアクションを実行するには、Liferay API Explorer にアクセスしてください。 GraphQL クエリとミューテーションの詳細については、 GraphQL API の使用 をお読みください。
-
右上隅の GraphQL をクリックし、次のミューテーション クエリを左の列に追加して、
siteKeyをサイト ID に置き換えます。mutation { headlessDelivery_v1_0 { updateSiteBlogPostingSubscribe(siteKey: "20117") } } -
クエリの実行をクリックします。 応答には、サブスクリプションが成功したかどうかを示すブール値が含まれます。
{ "data": { "headlessDelivery_v1_0": { "updateSiteBlogPostingSubscribe": true } } } -
次のクエリでサブスクリプションを確認します。
{ headlessAdminUser_v1_0 { myUserAccountSubscriptions { items { contentType dateCreated dateModified frequency id siteId } } } }応答では、ブログ投稿の購読を確認する必要があります。
{ "data": { "headlessAdminUser_v1_0": { "myUserAccountSubscriptions": { "items": [ { "contentType": "BlogPosting", "dateCreated": "2024-09-09T21:56:12Z", "dateModified": "2024-09-09T21:56:12Z", "frequency": "instant", "id": 32471, "siteId": 20117 } ] } } } }
通知の購読解除
headless-delivery 名前空間の下にあるアプリケーションの通知の登録を解除します。
RESTサービスの使用
REST API を使用して登録解除するには、登録解除アクションを含むエンドポイントを使用します。 これは、通知に使用されるサブスクライブ エンドポイントに対応します。 この例では、 ./BlogPostings_PUT_Unsubscribe_ToSites.sh スクリプトが、サイト上のブログ投稿に関する通知の登録を解除します。
curl \
"http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/blog-postings/unsubscribe" \
--header "Content-Type: application/json" \
--request "PUT" \
--user "test@liferay.com:learn"
[site-ID] を自分のサイトIDに置き換えて、 BlogPostings_PUT_Unsubscribe_ToSites.shを実行します。
BlogPostings_PUT_Unsubscribe_ToSites.sh [site-ID]
この呼び出しは応答を返しません。 Subscriptions_GET_FromMyUserAccount.shを実行して、サブスクリプションが削除されたことを確認します。 結果は空になるはずです:
{
"actions" : { },
"facets" : [ ],
"items" : [ ],
"lastPage" : 1,
"page" : 1,
"pageSize" : 20,
"totalCount" : 0
}
あるいは、対応する Java クラスを実行します。
java -classpath .:* -DsiteId=1234 BlogPostings_PUT_Unsubscribe_ToSites
Subscriptions_GET_FromMyUserAccount.java を実行して、登録解除が成功したことを確認します。
{"actions": {}, "items": [], "page": 1, "pageSize": 10, "totalCount": 0}
GraphQL サービスの使用
GraphQL サービスを使用して通知の登録を解除します。 このタスクを実行するには、Liferay API Explorer にアクセスします。
-
右上隅の GraphQL をクリックします。 次のミューテーション クエリを左の列に追加し、
siteKeyをサイト ID に置き換えます。mutation { headlessDelivery_v1_0 { updateSiteBlogPostingUnsubscribe(siteKey: "20117") } } -
クエリの実行をクリックします。 応答は、ユーザーが登録解除されているかどうかを示します。
{ "data": { "headlessDelivery_v1_0": { "updateSiteBlogPostingUnsubscribe": true } } }
サブスクリプションの削除
headless-admin-user 名前空間を使用して、 Subscriptions_GET_FromMyUserAccount.shに使用されているものと同様のエンドポイントを使用してサブスクリプションを削除します。 Subscriptions_DELETE_FromMyUserAccount.sh スクリプトを実行し、[subscription-ID] を特定のサブスクリプション ID に置き換えます。
操作が成功した場合、サーバーは本文のない 204 No Content 応答を返します。
次のコマンドを実行します。
./Subscriptions_DELETE_FromMyUserAccount.sh [subscription-ID]
Subscriptions_GET_FromMyUserAccount.shを実行して削除を確認します。
または、 Subscriptions_DELETE_FromMyUserAccount Java クラスを実行し、 -DsubscriptionId を特定のサブスクリプション ID に置き換えて、サブスクリプションを削除します。
java -classpath .:* -DsubscriptionId=1234 Subscriptions_DELETE_FromMyUserAccount
Subscriptions_GET_FromMyUserAccount.javaを実行して削除を確認します。
GraphQL サービスの使用
GraphQL サービスを使用してサブスクリプションを削除します。 このタスクを実行するには、Liferay API Explorer にアクセスします。
-
右上隅の GraphQL をクリックします。 次のミューテーション クエリを左の列に追加し、
subscriptionIdをサブスクリプション ID に置き換えます。mutation { headlessAdminUser_v1_0 { deleteMyUserAccountSubscription(subscriptionId: 32672) } } -
クエリの実行をクリックします。 応答は、サブスクリプションが削除されたかどうかを示します。
{ "data": { "headlessAdminUser_v1_0": { "deleteMyUserAccountSubscription": true } } }