メッセージボードAPIの基本
Liferay の Headless Delivery アプリケーションは、 掲示板 アプリケーションの REST サービスを提供します。 これらのサービスでは、掲示板のカテゴリ、スレッド、メッセージの追加、情報の一覧表示、内容の修正、削除が可能です。 ここでは、cURLコマンドとJavaクラスを使用してこれらのサービスを呼び出します。
掲示板のカテゴリは、Liferayのバックエンドではsectionsという名前になっています。 スレッドを整理するためのトピックを定義するセクションです。
チュートリアルリソースの準備
チュートリアルに進む前に、まずクリーンなLiferay Dockerコンテナをセットアップし、提供されたチュートリアルコードを使用できるように準備します。
Liferay Dockerコンテナ
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.55-ga55。
http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
起動したら、サイトIDを取得します。サイトIDを取得するには、 サイトメニュー()を開き、 設定 → サイト設定 → サイト設定 に移動します。
サイト構成設定の下にあるサイトIDを探す](./message-boards-api-basics/images/01.png)。
チュートリアルコード
以下は、Headless APIのデモを行うためのサンプルコードです。このコードには、サンプルのcURLファイルとJavaファイルの両方が含まれています。
以下のコマンドを実行し、 サンプルコード をダウンロード、解凍してください。
curl https://resources.learn.liferay.com/dxp/latest/ja/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依存関係情報は、/o/api
でインストール先のAPIエクスプローラーで確認できます。
提供されるコードには、 MessageBoardSection
, MessageBoardThread
and MessageBoardMessage
サービス用のAPIが含まれています。 含まれるすべてのサンプルAPIの一覧は、 チュートリアル・コード・リファレンス を参照してください。
提供されるコードでは、デモのためにBasic認証を使用しています。 本番環境では、 OAuth2 を使用してユーザーを認証する必要があります。
サンプルAPIを呼び出す
この演習では、cURL コマンドまたは Java クラスを使って、 MessageBoardSection
、 MessageBoardThread
、 MessageBoardMessage
の API を呼び出すことができます。 以下の出力例は、cURLコマンドに対応するもので、提供されたJavaクラスの出力とは若干異なります。
liferay-y3a6
プロジェクト内のcurl
またはjava
フォルダに移動します。cURLの場合:
cd liferay-y3a6/curl
Javaの場合:
cd liferay-y3a6/java
MessageBoardSection_POST_ToSite
を、サイト ID をパラメータとして実行します。 指定されたサイトに新しい掲示板セクションを作成します。cURLの場合:
./MessageBoardSection_POST_ToSite.sh {site-id}
Javaの場合:
java -classpath .:* -DsiteId={site-id} MessageBoardSection_POST_ToSite
ターミナルには、新しく作成されたセクションの完全なスキーマが表示されます。 提供されるAPIコールは、新しいセクションの
description
とname
フィールドのみを定義します。以下のGET、PATCH、PUT、DELETEメソッドで使用するために、セクションのIDをコピーします。
{ ... "description" : "Foo", "id" : 43925, ... "name" : "Able Section", ... }
MessageBoardSections_GET_FromSite
を、パラメータにサイトIDを指定して実行します。 指定されたサイト内のすべてのセクションのリストを返します。cURLの場合:
./MessageBoardSections_GET_FromSite.sh {site-id}
Javaの場合:
java -classpath .:* -DsiteId={site-id} MessageBoardSections_GET_FromSite
MessageBoardSection_PATCH_ById
をメッセージボードセクションの ID をパラメータとして実行します。 指定されたセクションの詳細を、APIコールで提供されたものに更新します。cURLの場合:
./MessageBoardSection_PATCH_ById.sh {message-board-section-id}
Javaの場合:
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardSection_PATCH_ById
これにより、
説明文
フィールドがバー
に更新されます。MessageBoardSection_PUT_ById
を、同じセクション ID をパラメータとして実行する。 指定されたセクションの詳細を、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
に更新されます。MessageBoardThread_POST_ToSite
を、パラメータにサイトIDを指定して実行します。 これにより、このサイトの新しい掲示板のスレッドが作成されます。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
)。MessageBoardThread_POST_ToSection
を上記セクションIDをパラメータに実行します。 指定したセクションの新しい掲示板のスレッドを作成します。cURLの場合:
./MessageBoardThread_POST_ToSection.sh {message-board-section-id}
Javaの場合:
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardThread_POST_ToSection
以下のGET、PATCH、PUTメソッドで使用するために、このスレッドのIDをコピーします。
{ ... "articleBody" : "Foo", ... "headline" : "Baker Thread", "id" : 43934, ... "messageBoardRootMessageId" : 43933, "messageBoardSectionId" : 43925, ... }
MessageBoardThread_PATCH_ById
を、スレッドの ID をパラメータとして実行します。 指定されたスレッドの詳細を、APIコールで提供されたものに更新する。cURLの場合:
./MessageBoardThread_PATCH_ById.sh {message-board-thread-id}
Javaの場合:
java -classpath .:* -DmessageBoardThreadId={message-board-thread-id} MessageBoardThread_PATCH_ById
これにより、
articleBody
フィールドがBar
に更新されます。MessageBoardThread_PUT_ById
を、パラメータに同じスレッド ID を使って実行する。 これは、指定されたスレッドの詳細を、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
に更新されます。MessageBoardThreads_GET_FromSite
を、パラメータにサイトIDを指定して実行します。 これは、セクションを持たないすべてのサイトスレッドのリストを返します。cURLの場合:
./MessageBoardThreads_GET_FromSite.sh {site-id}
Javaの場合:
java -classpath .:* -DsiteId={site-id} MessageBoardThreads_GET_FromSite
MessageBoardThreads_GET_FromSection
を、セクション ID をパラメータとして実行します。 指定されたセクションにあるすべてのスレッドのリストを返す。cURLの場合:
./MessageBoardThreads_GET_FromSection.sh {message-board-section-id}
Javaの場合:
java -classpath .:* -DmessageBoardSectionId={message-board-section-id} MessageBoardThreads_GET_FromSection
MessageBoardMessage_POST_ToThread
を、上記のいずれかのスレッド ID をパラメータとして実行します。 指定されたスレッドに対して、新しい掲示板のメッセージを作成します。cURLの場合:
./MessageBoardMessage_POST_ToThread.sh {message-board-thread-id}
Javaの場合:
java -classpath .:* -DmessageBoardThreadId={message-board-thread-id} MessageBoardMessage_POST_ToThread
次の PUT、PATCH、POST コマンドで使用するために、メッセージの ID をコピーします。
{ ... "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
に更新されます。MessageBoardMessage_POST_ToParent
を、直前のメッセージ ID をパラメータに実行する。 指定されたメッセージの新しい子メッセージを作成します。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, ... }
MessageBoardMessages_GET_FromThread
を、パラメータにスレッド ID を指定して実行します。 スレッドのルートメッセージに対する子メッセージのリストを返します(すなわち、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
を実行する。 指定された Message の全ての子メッセージのリストを返します。cURLの場合:
./MessageBoardMessages_GET_FromParent.sh {parent-message-board-message-id}
Javaの場合:
java -classpath .:* -DparentMessageBoardMessageId={parent-message-board-message-id} MessageBoardMessages_GET_FromParent
最後に作成した子メッセージのデータも出力されるはずです。
MessageBoardSection_DELETE_ById
を、同じセクション ID をパラメータとして実行します。 指定されたセクションとそのスレッド、メッセージを削除します。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エンドポイント | 説明 |
---|---|---|---|
メッセージボードスレッド | POST |
/v1.0/sites/[siteId]/message-board-threads |
APIコールで指定された内容で新しいスレッドを作成します。 |
メッセージボードスレッド | POST |
/v1.0/message-board-sections/[messageBoardSectionId]/message-board-threads |
APIコールで提供された詳細を使用して、指定されたカテゴリ内に新しいスレッドを作成します。 |
メッセージボードスレッド | GET |
/v1.0/sites/[siteId]/message-board-threads |
カテゴリに属さないすべてのサイトスレッドの完全なリストを返します。結果はページ分割、フィルタリング、検索、およびソートが可能です。 |
メッセージボードスレッド | GET |
/v1.0/message-board-sections/[messageBoardSectionId]/message-board-threads |
指定されたカテゴリの全スレッドの完全なリストを返します。結果はページ分割、フィルタリング、検索、ソートが可能です |
メッセージボードスレッド | PATCH |
/v1.0/message-board-threads/[messageBoardThreadId] |
スレッドのAPIコールで指定されたフィールドのみを更新する |
メッセージボードスレッド | PUT |
/v1.0/message-board-threads/[messageBoardThreadId] |
指定されたスレッドのすべてのフィールドを、APIコールで提供されたフィールドに置き換える。 |
メッセージボードスレッド | DELETE |
/v1.0/message-board-threads/[messageBoardThreadId] |
指定されたスレッドを削除し、操作に成功した場合は204を返す |
MessageBoardMessage API のサンプル
サービス | HTTP メソッド | HTTPエンドポイント | 説明 |
---|---|---|---|
メッセージボード・メッセージ | POST |
/v1.0/message-board-threads/[messageBoardThreadId]/message-board-messages |
指定されたスレッドに、APIコールで指定された詳細な情報を持つ新規メッセージを作成する。 |
メッセージボード・メッセージ | GET |
/v1.0/message-board-threads/[messageBoardThreadId]/message-board-messages |
指定されたスレッドにある全てのメッセージの完全なリストを返す。結果はページ分割、フィルタリング、検索、ソートが可能 |
メッセージボード・メッセージ | PATCH |
/v1.0/message-board-messages/[messageBoardMessageId] |
メッセージのAPIコールで指定されたフィールドのみを更新します。 |
メッセージボード・メッセージ | PUT |
/v1.0/message-board-messages/[messageBoardMessageId] |
指定されたメッセージのすべてのフィールドを、APIコールで提供されたフィールドに置き換える |
メッセージボード・メッセージ | DELETE |
/v1.0/message-board-messages/[messageBoardMessageId] |
指定されたメッセージを削除し、成功した場合は 204 を返す。 |
サンプルのcURLスクリプトの検証
以下は、チュートリアルのcURLコマンドの代表的な例です。
MessageBoardSection_POST_ToSite.sh
curl \
-H 'Content-Type: application/json' \
-X 'POST' "http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/message-board-sections" \
-d "{\"description\": \"Foo\", \"title\": \"Able Section\"}" \
-u "[email protected]:learn"
MessageBoardSection_PUT_ById.sh
curl \
-H 'Content-Type: application/json' \
-X 'PUT' \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-sections/${1}" \
-d "{\"description\": \"Goo\", \"title\": \"Baker Section\"}" \
-u "[email protected]:learn"
MessageBoardSections_GET_FromSite.sh
curl \
"http://localhost:8080/o/headless-delivery/v1.0/sites/${1}/message-board-sections" \
-u "[email protected]:learn"
MessageBoardSection_DELETE_ById.sh
curl \
-X 'DELETE' \
"http://localhost:8080/o/headless-delivery/v1.0/message-board-sections/${1}" \
-u "[email protected]:learn"
MessageBoardThread_POST_ToSection.sh(メッセージボードスレッドポストセクション)。
curl \
-H 'Content-Type: application/json' \
-X 'POST' "http://localhost:8080/o/headless-delivery/v1.0/message-board-sections/${1}/message-board-threads" \
-d "{\"articleBody\": \"Foo\", \"headline\": \"Baker Thread\"}" \
-u "[email protected]:learn"
MessageBoardMessage_POST_ToThread.sh
curl \
-H 'Content-Type: application/json' \
-X 'POST' "http://localhost:8080/o/headless-delivery/v1.0/message-board-threads/${1}/message-board-messages" \
-d "{\"articleBody\": \"Foo\", \"headline\": \"Able Message\"}" \
-u "[email protected]:learn"
MessageBoardMessage_POST_ToParent.sh
curl \
-H 'Content-Type: application/json' \
-X 'POST' "http://localhost:8080/o/headless-delivery/v1.0/message-board-messages/${1}/message-board-messages" \
-d "{\"articleBody\": \"Foo\", \"headline\": \"Charlie Message\"}" \
-u "[email protected]: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(
"[email protected]", "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(
"[email protected]", "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(
"[email protected]", "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(
"[email protected]", "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(
"[email protected]", "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(
"[email protected]", "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(
"[email protected]", "learn"
).build();
MessageBoardMessage messageBoardMessage =
messageBoardMessageResource.
postMessageBoardMessageMessageBoardMessage(
Long.valueOf(
System.getProperty("parentMessageBoardMessageId")),
new MessageBoardMessage() {
{
articleBody = "Foo";
headline = "Fox Message";
}
});
System.out.println(messageBoardMessage);
}
}