掲示板APIの基本
LiferayのHeadless Deliveryアプリケーションは、 掲示板 アプリケーションにRESTサービスを提供します。 これらのサービスでは、掲示板カテゴリやスレッド、メッセージの追加、情報の一覧表示、内容の修正や完全な削除が可能です。 ここでは、cURLコマンドとJavaクラスを使用してこれらのサービスを呼び出します。
掲示板カテゴリは、Liferayのバックエンドではsectionsという名前になっています。 これらのセクションでは、スレッドを整理するためのトピックを定義します。
チュートリアルリソースの準備
チュートリアルに進む前に、まずクリーンなLiferay Dockerコンテナをセットアップし、提供されたチュートリアルコードを使用できるように準備します。
Liferay Dockerコンテナ
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 。
http://localhost:8080でLiferayへのサインインします。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。
開始したら、サイトIDを取得します。 サイトIDを見つけるには、 サイトメニュー(
)を開き、 [Configuration] → [Site Settings] → [Site Configuration] に移動します。

チュートリアルコード
以下はヘッドレスAPIをデモするサンプルコードです。 本コードには、サンプルのcURLとJavaファイルの両方が含まれています。
次のコマンドを実行して、 サンプルコード をダウンロードして解凍します。
curl https://resources.learn.liferay.com/dxp/latest/en/collaboration-and-social/message-boards/developer-guide/liferay-y3a6.zip -O
unzip liferay-y3a6.zip
cURLスクリプトを使用する準備ができたら、実行する前にJavaソースファイルを手動でコンパイルする必要があります。 これを行うには、プロジェクトの java フォルダーに行き、javac コマンドを実行する。
cd liferay-y3a6/java
javac -classpath .:* *.java
このプロジェクトには com.liferay.headless.delivery.client.jar ファイルが依存関係として含まれていることに注意してください。 すべての REST アプリケーションのクライアント JAR 依存情報は、インストー ルの API エクスプローラーの /o/api にある。
提供されるコードには MessageBoardSection、MessageBoardThread、MessageBoardMessage サービスの API が含まれる。 含まれているサンプルAPIの一覧は、 Tutorial Code Reference をご参照ください。
提供されるコードは、デモのために基本認証を使用しています。 本番環境では、 OAuth2 でユーザーを認証する必要があります。
サンプルAPIの呼び出し
この練習では、cURLコマンドかJavaクラスを使ってMessageBoardSection、MessageBoardThread、MessageBoardMessageの各APIを呼び出すことができる。 次の出力例はcURLコマンドに対応しており、提供されているJavaクラスの出力とは少し異なります。
-
liferay-y3a6プロジェクトのcurlまたはjavaフォルダに移動します。cURLの場合
cd liferay-y3a6/curlJavaの場合
cd liferay-y3a6/java -
サイトIDをパラメータとして
MessageBoardSection_POST_ToSiteを実行する。 これにより、指定したサイトに新しい掲示板セクションが作成されます。cURLの場合
./MessageBoardSection_POST_ToSite.sh {site-id}Javaの場合
java -classpath .:* -DsiteId={site-id} MessageBoardSection_POST_ToSite端末には、新しく作成されたセクションの完全なスキーマが表示されます。 提供されるAPIコールは、新しいセクションの
descriptionフィールドとnameフィールドを定義するだけである。 -
セクションのIDをコピーして、以下のGET、PATCH、PUT、DELETEメソッドで使用します。
{ ... "description" : "Foo", "id" : 43925, ... "name" : "Able Section", ... } -
パラメータにサイト ID を使用して
MessageBoardSections_GET_FromSiteを実行する。 これにより、指定したサイト内のすべてのセクションのリストが返されます。cURLの場合
./MessageBoardSections_GET_FromSite.sh {site-id}Javaの場合
java -classpath .:* -DsiteId={site-id} MessageBoardSections_GET_FromSite -
メッセージボードセクションのIDをパラメータとして
MessageBoardSection_PATCH_ByIdを実行する。 これにより、指定されたエントリーの詳細がAPI呼び出しで提供された詳細に更新されます。cURLの場合
./MessageBoardSection_PATCH_ById.sh {message-board-section-id}Javaの場合
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardSection_PATCH_ByIdこれは
descriptionフィールドをBarに更新する。 -
同じセクションIDをパラメータとして
MessageBoardSection_PUT_ByIdを実行する。 これにより、指定されたエントリーの詳細がAPI呼び出しで提供された詳細に置き換えられます。cURLの場合
./MessageBoardSection_PUT_ById.sh {message-board-section-id}Javaの場合
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardSection_PUT_ByIdこれは
nameフィールドをBaker Sectionに、descriptionフィールドをGooに更新します。 -
パラメータにサイト ID を使用して
MessageBoardThread_POST_ToSiteを実行する。 これにより、サイトの新しい掲示板スレッドが作成されます。cURLの場合
./MessageBoardThread_POST_ToSite.sh {site-id}Javaの場合
java -classpath .:* -DsiteId={site-id} MessageBoardThread_POST_ToSite{ ... "articleBody" : "Foo", ... "headline" : "Able Thread", "id" : 43942, ... "messageBoardRootMessageId" : 43941, }すべてのスレッドは、スレッド内のすべての直接返信の親メッセージとなるルートメッ セージ(つまり
messageBoardRootMessageId)で作成される。 -
上記のセクションIDをパラメータとして
MessageBoardThread_POST_ToSectionを実行する。 これにより、指定されたセクションの新しい掲示板スレッドが作成されます。cURLの場合
./MessageBoardThread_POST_ToSection.sh {message-board-section-id}Javaの場合
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardThread_POST_ToSection -
このスレッドのIDをコピーして、以下のGET、PATCH、PUTメソッドで使用します。
{ ... "articleBody" : "Foo", ... "headline" : "Baker Thread", "id" : 43934, ... "messageBoardRootMessageId" : 43933, "messageBoardSectionId" : 43925, ... } -
スレッドの ID をパラメータとして
MessageBoardThread_PATCH_ByIdを実行する。 これにより、指定されたスレッドの詳細がAPI呼び出しで提供された詳細に更新されます。cURLの場合
./MessageBoardThread_PATCH_ById.sh {message-board-thread-id}Javaの場合
java -classpath .:* -DmessageBoardThreadId={message-board-thread-id} MessageBoardThread_PATCH_ByIdこれは
articleBodyフィールドをBarに更新する。 -
同じスレッド ID をパラメータとして
MessageBoardThread_PUT_ByIdを実行する。 これにより、指定されたスレッドの詳細がAPI呼び出しで提供された詳細に置き換えられます。cURLの場合
./MessageBoardThread_PUT_ById.sh {message-board-thread-id}Javaの場合
java -classpath .:* -DmessageBoardThreadId={message-board-thread-id} MessageBoardThread_PUT_ByIdこれにより、
headlineフィールドがCharlie Threadに、articleBodyフィールドがGooに更新される。 -
パラメータにサイト ID を使用して
MessageBoardThreads_GET_FromSiteを実行する。 これにより、セクションを持たないすべてのサイトスレッドのリストが返されます。cURLの場合
./MessageBoardThreads_GET_FromSite.sh {site-id}Javaの場合
java -classpath .:* -DsiteId={site-id} MessageBoardThreads_GET_FromSite -
セクション ID をパラメータとして
MessageBoardThreads_GET_FromSectionを実行する。 これにより、指定したセクション内のすべてのスレッドのリストが返されます。cURLの場合
./MessageBoardThreads_GET_FromSection.sh {message-board-section-id}Javaの場合
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardThreads_GET_FromSection -
上記のいずれかのスレッド ID をパラメータとして
MessageBoardMessage_POST_ToThreadを実行する。 これにより、指定されたスレッドの新しい掲示板のメッセージが作成されます。cURLの場合
./MessageBoardMessage_POST_ToThread.sh {message-board-thread-id}Javaの場合
java -classpath .:* -DmessageBoardThreadId={message-board-thread-id} MessageBoardMessage_POST_ToThread -
メッセージのIDをコピーして、以下のPUT、PATCH、POSTコマンドで使用します。
{ ... "articleBody" : "Foo", ... "headline" : "Able Message", "id" : 43946, ... "messageBoardSectionId" : 43925, "messageBoardThreadId" : 43934, "parentMessageBoardMessageId" : 43933, ... }新しいメッセージはスレッドのルートメッセージ(
messageBoardRootMessageId)の子メッセージとして作成されます。 -
メッセージの ID をパラメータとして
MessageBoardMessage_PATCH_ByIdを実行する。 これにより、指定されたメッセージの詳細がAPI呼び出しで提供された詳細に更新されます。cURLの場合
./MessageBoardMessage_PATCH_ById.sh {message-board-message-id}Javaの場合
java -classpath .:* -DmessageBoardMessageId={message-board-message-id} MessageBoardMessage_PATCH_ByIdこれは
articleBodyフィールドをBarに更新する。 -
同じメッセージ ID をパラメータとして
MessageBoardMessage_PUT_ByIdを実行する。 これにより、指定されたメッセージの詳細がAPI呼び出しで提供された詳細に置き換えられます。cURLの場合
./MessageBoardMessage_PUT_ById.sh {message-board-message-id}Javaの場合
java -classpath .:* -DmessageBoardMessageId={message-board-message-id} MessageBoardMessage_PUT_ByIdこれにより、
headlineフィールドがBaker Messageに、articleBodyフィールドがGooに更新される。 -
直前のメッセージ ID をパラメータとして
MessageBoardMessage_POST_ToParentを実行する。 これにより、指定したメッセージの子メッセージが作成されます。cURLの場合
./MessageBoardMessage_POST_ToParent.sh {parent-message-board-message-id}Javaの場合
java -classpath .:* -DparentMessageBoardMessageId={parent-message-board-message-id} MessageBoardMessage_POST_ToParent{ ... "articleBody" : "Foo", ... "headline" : "Charlie Message", "id" : 43949, ... "messageBoardSectionId" : 43925, "messageBoardThreadId" : 43934, ... "parentMessageBoardMessageId" : 43946, ... } -
スレッド ID をパラメータとして
MessageBoardMessages_GET_FromThreadを実行する。 これはスレッドのルートメッセージ(つまりmessageBoardRootMessage)の子メッセージのリストを返します。cURLの場合
./MessageBoardMessages_GET_FromThread.sh {message-board-thread-id}Javaの場合
java -classpath .:* -DmessageBoardThreadId={message-board-thread-id} MessageBoardMessages_GET_FromThread出力には、スレッドで作成した最初のメッセージのデータが含まれ、そのメッセージ自体に1つの子メッセージが含まれている必要があります。 これはメッセージの
numberOfMessageBoardMessagesフィールドで示される。 -
直前のメッセージの ID をパラメータとして
MessageBoardMessages_GET_FromParentを実行する。 これにより、指定したメッセージの子メッセージのすべてのリストが返されます。cURLの場合
./MessageBoardMessages_GET_FromParent.sh {parent-message-board-message-id}Javaの場合
java -classpath .:* -DparentMessageBoardMessageId={parent-message-board-message-id} MessageBoardMessages_GET_FromParent出力には、最後に作成した子メッセージのデータも含まれるはずです。
-
同じセクションIDをパラメータとして
MessageBoardSection_DELETE_ByIdを実行する。 これにより、指定されたセクションが、そのスレッドやメッセージとともに削除されます。cURLの場合
./MessageBoardSection_DELETE_ById.sh {message-board-section-id}Javaの場合
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardSection_DELETE_ById -
同じセクション ID をパラメータとして
MessageBoardSection_GET_ByIdを実行する。指定したセクションが存在すれば、その詳細を返します。cURLの場合
./MessageBoardSection_GET_ById.sh {message-board-section-id}Javaの場合
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardSection_GET_ById前のステップでセクションを削除したため、次のメッセージが返されます。
{ "status" : "NOT_FOUND", "title" : "No MessageBoardSection exists with the primary key 43925" }
コード参照
提供されているサンプルコードには、以下の MessageBoardSection、MessageBoardThread、MessageBoardMessage API 用の cURL スクリプトと Java クラスが含まれている。
MessageBoardSectionのサンプルAPI
サンプルコードには、次のAPIを呼び出すcURLスクリプトとJavaクラスが含まれています。
| サービス | HTTP メソッド | HTTPエンドポイント | 説明 |
|---|---|---|---|
| MessageBoardSection | POST | /v1.0/sites/[siteId]/message-board-sections | API呼び出しで提供された詳細を使用して、新規カテゴリーを作成します |
| MessageBoardSection | GET | /v1.0/sites/[siteId]/message-board-sections | 指定されたサイト内のすべてのカテゴリーの完全なリストを返します。結果に対して、ページ分割、絞り込み、検索、およびソートをすることができます |
| MessageBoardSection | PATCH | /v1.0/message-board-sections/[messageBoardSectionId] | カテゴリのAPI呼び出しで指定されたフィールドのみを更新します |
| MessageBoardSection | PUT | /v1.0/message-board-sections/[messageBoardSectionId] | 指定されたカテゴリのすべてのフィールドを、API呼び出しで提供されたフィールドに置き換えます。 |
| MessageBoardSection | DELETE | /v1.0/message-board-sections/[messageBoardSectionId] | 指定されたスレッドを削除し、操作が成功した場合は204を返す |
MessageBoardThreadのサンプルAPI
| サービス | HTTP メソッド | HTTPエンドポイント | 説明 |
|---|---|---|---|
| MessageBoardThread | POST | /v1.0/sites/[siteId]/message-board-threads | API呼び出しで提供された詳細を使用して、新規スレッドを作成します |
| MessageBoardThread | POST | /v1.0/message-board-sections/[messageBoardSectionId]/message-board-threads | API呼び出しで提供された詳細を使用して、指定されたカテゴリ内に新規スレッドを作成します。 |
| MessageBoardThread | GET | /v1.0/sites/[siteId]/message-board-threads | カテゴリに属さないすべてのサイトスレッドの完全なリストを返します。結果はページ分割、絞り込み、検索、ソートが可能です。 |
| MessageBoardThread | GET | /v1.0/message-board-sections/[messageBoardSectionId]/message-board-threads | 指定されたカテゴリ内のすべてのスレッドの完全なリストを返します。結果に対して、ページ分割、絞り込み、検索、およびソートをすることができます |
| MessageBoardThread | PATCH | /v1.0/message-board-threads/[messageBoardThreadId] | スレッドのAPI呼び出しで指定されたフィールドのみを更新します |
| MessageBoardThread | PUT | /v1.0/message-board-threads/[messageBoardThreadId] | 指定されたスレッドのすべてのフィールドを、API呼び出しで提供されたフィールドに置き換えます |
| MessageBoardThread | DELETE | /v1.0/message-board-threads/[messageBoardThreadId] | 指定されたスレッドを削除し、操作が成功した場合は204を返す |
MessageBoardMessageのサンプルAPI
| サービス | HTTP メソッド | HTTPエンドポイント | 説明 |
|---|---|---|---|
| MessageBoardMessage | POST | /v1.0/message-board-threads/[messageBoardThreadId]/message-board-messages | API呼び出しで提供された詳細を使用して、指定されたスレッドに新規メッセージを作成します。 |
| MessageBoardMessage | GET | /v1.0/message-board-threads/[messageBoardThreadId]/message-board-messages | 指定されたスレッド内のすべてのメッセージの完全なリストを返します。結果に対して、ページ分割、絞り込み、検索、およびソートをすることができます |
| MessageBoardMessage | PATCH | /v1.0/message-board-messages/[messageBoardMessageId] | メッセージのAPI呼び出しで指定されたフィールドのみを更新します |
| MessageBoardMessage | PUT | /v1.0/message-board-messages/[messageBoardMessageId] | 指定されたメッセージのすべてのフィールドを、APIコールで提供されたフィールドに置き換えます |
| MessageBoardMessage | DELETE | /v1.0/message-board-messages/[messageBoardMessageId] | 指定されたメッセージを削除し、成功すれば204を返す |
サンプルのcURLスクリプトの検証
以下は、チュートリアルのcURLコマンドの代表的な例です。
MessageBoardSection_POST_ToSite.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/message-board-sections" \
--data-raw '
{
"description": "Foo",
"title": "Able Section"
}' \
--header "Content-Type: application/json" \
--request "POST" \
--user "test@liferay.com:learn"
MessageBoardSection_PUT_ById.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-sections/${1}" \
--data-raw '
{
"description": "Goo",
"title": "Baker Section"
}' \
--header "Content-Type: application/json" \
--request "PUT" \
--user "test@liferay.com:learn"
MessageBoardSections_GET_FromSite.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/message-board-sections" \
--user "test@liferay.com:learn"
MessageBoardSection_DELETE_ById.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-sections/${1}" \
--request "DELETE" \
--user "test@liferay.com:learn"
MessageBoardThread_POST_ToSection.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-sections/${1}/message-board-threads" \
--data-raw '
{
"articleBody": "Foo",
"headline": "Baker Thread"
}' \
--header "Content-Type: application/json" \
--request "POST" \
--user "test@liferay.com:learn"
MessageBoardMessage_POST_ToThread.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-threads/${1}/message-board-messages" \
--data-raw '
{
"articleBody": "Foo",
"headline": "Able Message"
}' \
--header "Content-Type: application/json" \
--request "POST" \
--user "test@liferay.com:learn"
MessageBoardMessage_POST_ToParent.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-messages/${1}/message-board-messages" \
--data-raw '
{
"articleBody": "Foo",
"headline": "Charlie Message"
}' \
--header "Content-Type: application/json" \
--request "POST" \
--user "test@liferay.com:learn"
サンプルのJavaクラスの検証
以下は、チュートリアルのJavaコマンドの代表的な例です。
MessageBoardSection_POST_ToSite.java
public class MessageBoardSection_POST_ToSite {
/**
* java -classpath .:* -DsiteId=1234 MessageBoardSection_POST_ToSite
*/
public static void main(String[] args) throws Exception {
MessageBoardSectionResource.Builder builder =
MessageBoardSectionResource.builder();
MessageBoardSectionResource messageBoardSectionResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
MessageBoardSection messageBoardSection =
messageBoardSectionResource.postSiteMessageBoardSection(
Long.valueOf(System.getProperty("siteId")),
new MessageBoardSection() {
{
description = "Foo";
title = "Charlie Section";
}
});
System.out.println(messageBoardSection);
}
}
MessageBoardSection_PUT_ById.java
public class MessageBoardSection_PUT_ById {
/**
* java -classpath .:* -DmessageBoardSectionId=1234 MessageBoardSection_PUT_ById
*/
public static void main(String[] args) throws Exception {
MessageBoardSectionResource.Builder builder =
MessageBoardSectionResource.builder();
MessageBoardSectionResource messageBoardSectionResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
MessageBoardSection messageBoardSection =
messageBoardSectionResource.putMessageBoardSection(
Long.valueOf(System.getProperty("messageBoardSectionId")),
new MessageBoardSection() {
{
description = "Goo";
title = "Dog Section";
}
});
System.out.println(messageBoardSection);
}
}
MessageBoardSections_GET_FromSite.java
public class MessageBoardSections_GET_FromSite {
/**
* java -classpath .:* -DsiteId=1234 MessageBoardSections_GET_FromSite
*/
public static void main(String[] args) throws Exception {
MessageBoardSectionResource.Builder builder =
MessageBoardSectionResource.builder();
MessageBoardSectionResource messageBoardSectionResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
Page<MessageBoardSection> page =
messageBoardSectionResource.getSiteMessageBoardSectionsPage(
Long.valueOf(System.getProperty("siteId")), null, null, null,
null, Pagination.of(1, 2), null);
System.out.println(page);
}
}
MessageBoardSection_DELETE_ById.java
public class MessageBoardSection_DELETE_ById {
/**
* java -classpath .:* -DmessageBoardSectionId=1234 MessageBoardSection_DELETE_ById
*/
public static void main(String[] args) throws Exception {
MessageBoardSectionResource.Builder builder =
MessageBoardSectionResource.builder();
MessageBoardSectionResource messageBoardSectionResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
messageBoardSectionResource.deleteMessageBoardSection(
Long.valueOf(System.getProperty("messageBoardSectionId")));
}
}
MessageBoardThread_POST_ToSection.java
public class MessageBoardThread_POST_ToSection {
/**
* java -classpath .:* -DmessageBoardSectionId=1234 MessageBoardThread_POST_ToSection
*/
public static void main(String[] args) throws Exception {
MessageBoardThreadResource.Builder builder =
MessageBoardThreadResource.builder();
MessageBoardThreadResource messageBoardThreadResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
MessageBoardThread messageBoardThread =
messageBoardThreadResource.
postMessageBoardSectionMessageBoardThread(
Long.valueOf(System.getProperty("messageBoardSectionId")),
new MessageBoardThread() {
{
articleBody = "Foo";
headline = "Easy Thread";
}
});
System.out.println(messageBoardThread);
}
}
MessageBoardMessage_POST_ToThread.java
public class MessageBoardMessage_POST_ToThread {
/**
* java -classpath .:* -DmessageBoardThreadId=1234 MessageBoardMessage_POST_ToThread
*/
public static void main(String[] args) throws Exception {
MessageBoardMessageResource.Builder builder =
MessageBoardMessageResource.builder();
MessageBoardMessageResource messageBoardMessageResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
MessageBoardMessage messageBoardMessage =
messageBoardMessageResource.
postMessageBoardThreadMessageBoardMessage(
Long.valueOf(System.getProperty("messageBoardThreadId")),
new MessageBoardMessage() {
{
articleBody = "Foo";
headline = "Dog Message";
}
});
System.out.println(messageBoardMessage);
}
}
MessageBoardMessage_POST_ToParent.java
public class MessageBoardMessage_POST_ToParent {
/**
* java -classpath .:* -DparentMessageBoardMessageId=1234 MessageBoardMessage_POST_ToParent
*/
public static void main(String[] args) throws Exception {
MessageBoardMessageResource.Builder builder =
MessageBoardMessageResource.builder();
MessageBoardMessageResource messageBoardMessageResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
MessageBoardMessage messageBoardMessage =
messageBoardMessageResource.
postMessageBoardMessageMessageBoardMessage(
Long.valueOf(
System.getProperty("parentMessageBoardMessageId")),
new MessageBoardMessage() {
{
articleBody = "Foo";
headline = "Fox Message";
}
});
System.out.println(messageBoardMessage);
}
}