RESTサービスの使用
Liferay DXPには、ほとんどのアプリケーションでRESTサービスが含まれています。 これらのサービスは完全に OpenAPI に準拠しています。 ここでは、それらの食べ方を学びましょう。 必要なステップはわずか3つです。
-
使用するサービスを特定します。
-
必要なデータを含むサイトを特定します。
-
データにアクセスできる資格情報を使用してサービス呼び出しを行います。
Liferay DXP 2025.Q3以降では、 {siteId} を使用するRESTサービスエンドポイントは、サイトのキーまたは外部参照コードでも動作します。 値が矛盾する場合は、次の順序で解決されます。
- サイトキー(デフォルト言語でのサイト名)
- サイトID
- サイト外部参照コード
この例では、Liferay DXPの新規インストールでDockerイメージを使用しています。
使用するサービスを特定する
RESTサービスを呼び出すには、実行中のLiferay DXPが必要です。
新しい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に変更します。
さまざまな API エンドポイントを表示するには、ブラウザを使用して Liferay の API Explorer にアクセスします。 [server]:[port]/o/api。 例えば、Dockerインスタンスでは、以下の場所にあります。
http://localhost:8080/o/api
APIはいくつかのカテゴリに分類されます。 この例では、BlogPostingサービスを使用して[Blogs]ウィジェットからブログ投稿を取得していますが、この手順は公開されているどのサービスでも使用できます。
-
ヘッドレス配信 カテゴリを選択してください。 このカテゴリには
ブログ投稿サービスが含まれています。 フィルターを使用してサービスを検索できます。 -
[ スキーマ表示]ボタンをクリックすると、画面の右側に、このカテゴリのすべてのスキーマのリストが表示されます。
-
スキーマ ブラウザのタブを開いたままにしておきます。
BlogPostingを PUT したいときは、そのスキーマを使用します。

APIスキーマを取得する
オプションとして、 openapi.json 仕様を使用して API のスキーマを確認できます。 指定されたスキーマの情報は、 [server]:[port]/o/[schema]/v1.0/openapi.json から JSON レスポンスとして取得できます。
例えば、この curl コマンドは、 openapi.json を headless-admin-user スキーマ用に取得し、生の OpenAPI JSON をファイルに保存します。
curl -X GET --user "test@liferay.com:learn" http://localhost:8080/o/headless-admin-user/v1.0/openapi.json > openapi.json
ファイル内のJSON構造を調べたり解析したりして、目的のスキーマをより深く理解してください。
フィルタリング可能なフィールドインジケーター
Liferay 2025.Q2+
また、 openapi.json 仕様を使用して、エンティティのフィールド (またはオブジェクトの場合はネストされたフィールド) のうちどれが フィルタ パラメータ をサポートしているかを確認することもできます。 スキーマ内の各エンティティには、キー x-filterableを持つ JSON 配列が含まれており、どのフィールド (存在する場合) がフィルタリングをサポートしているかを示します。
例えば、この x-filterable 配列は、関連付けられたエンティティを dateCreated、 dateModified、 id、または name でフィルタリングできることを示しています。
"x-filterable" : [ "dateCreated", "dateModified", "id", "name" ]
Liferay 2025.Q2 より前のバージョンでは、フィールドがフィルタリングをサポートしている場合でも、 x-filterable JSON 配列が openapi.jsonに含まれません。
ヘッドレスアクションキー
各ヘッドレスエンドポイントのメソッドには、URLとは独立してメソッドを識別する 個のヘッドレスアクションキー があります。 これらのアクションキーは、 データセットアクションなど、他のアプリケーションのアクションに接続するのに役立ちます。
API Explorer を使用すると、特定のエンドポイントのアクションキーを見つけることができます。 選択したエンドポイント(例:ユーザーアカウント)に対して、GETアクションを実行します。 サーバー応答 JSON の本文には、各アクション キーを含む アクション ブロックが含まれます。
例えば、 /o/headless-admin-user/ エンドポイント ( /v1.0/user-accounts/{userAccountId} の GET メソッド) に対するアクション キーを示すレスポンスを以下に示します。 表示されるアクション キーには、 get-user-account-by-external-reference-code、 put-user-accountなどが含まれます。

ルートモデルのRESTコンテキストパス
Liferay DXP 2024.Q3+/Portal GA125+
変更可能なシステムオブジェクトに関連するオブジェクト定義を扱う場合、RESTコンテキストパスにはルートモデルのパスが含まれます。 これはモデル間の階層的な関係を反映しており、APIエンドポイントを効率的に整理するのに役立ちます。
一部のルートモデルは共通の名前空間にグループ化されており、その名前空間を表す接頭辞を前に付ける必要があることに注意してください。 この接頭辞は通常、システムのモジュールまたは機能領域を表します。
例えば、 APIApplication ルートモデルは、 API Builder コンポーネントの一部です。 すべてのエンドポイントは、 headless-builder プレフィックスの下にあります。 同様に、コマース関連の機能は headless-commerce-admin というプレフィックスの下にあります。
この情報は、 Liferay の API Explorer を使用して見つけることができます。 右上隅の REST アプリケーション (1) をクリックします。 RESTアプリケーションは、該当する場合はプレフィックスを含めた対応するパスとともに表示されます(2)。 パスは「サーバー(3)」で確認できます。

コンテキストパスの例:
-
接頭辞付き:
APIApplicationはルートモデルであり、APIEndpointはその子孫であり、REST エンドポイントを構成します。APIApplicationの場合:/headless-builder/application。APIエンドポイントの場合:/headless-builder/applications/endpoints。 -
接頭辞なし:
一部のREST APIエンドポイントは名前空間にグループ化されていないため、プレフィックスを使用しません。
例えば、
CommerceReturnがルートモデルで、CommerceReturnItemがその子孫である場合、REST エンドポイントは次のようになります。CommerceReturnの場合:/commerce-returns。CommerceReturnItemの場合:/commerce-returns/commerce-return/items。
以下の表は、変更可能なシステムオブジェクトと、それらに対応するRESTコンテキストパスを示しています。 この情報を使用して、変更可能なシステムオブジェクトを操作する際に、RESTコンテキストパスを構築する方法を理解してください。
| オブジェクト定義 | RESTコンテキストパス |
|---|---|
APIApplication | /headless-builder/applications |
APIEndpoint | /headless-builder/endpoints |
APIFilter | /headless-builder/filters |
APIProperty | /headless-builder/properties |
APISchema | /headless-builder/schemas |
APISort | /headless-builder/sorts |
Bookmark | /bookmarks |
CommerceReturn | /commerce/returns |
CommerceReturnItem | /commerce/return-items |
FDSAction | /data-set-manager/actions |
FDSCardsSection | /data-set-manager/cards-sections |
FDSClientExtensionFilter | /data-set-manager/client-extension-filters |
FDSDateFilter | /data-set-manager/date-filters |
FDSDynamicFilter | /data-set-manager/selection-filters |
FDSEntry | /data-set-manager/entries |
FDSField | /data-set-manager/table-sections |
FDSListSection | /data-set-manager/list-sections |
FDSSort | /data-set-manager/sorts |
FDSView | /data-set-manager/data-sets |
FunctionalCookieEntry | /functional-cookies-entries |
NecessaryCookieEntry | /necessary-cookies-entries |
PerformanceCookieEntry | /performance-cookies-entries |
PersonalizationCookieEntry | /personalization-cookies-entries |
データを含むサイトを特定する
次に、デフォルトのサイトIDを見つける必要があります。
-
サイトメニュー(
)を開き、 設定 → サイト設定に移動します。 -
プラットフォームセクションで、[Site Configuration]をクリックします。 Liferay DXPバージョン7.3以前の場合は、一般タブをクリックします。
-
サイトIDの下にあるサイト識別子を探してください。

Liferay DXP 2025.Q1+/Portal GA132+ では、ここにサイトの外部参照コードも記載されており、これを使用して REST エンドポイントのサイトを識別することもできます。
データへのアクセス権限を持つ認証情報を使用してサービス呼び出しを行う
これで電話をかけるために必要なものはすべて揃いました。 すべてのウェブサービスにアクセスするには、要求するデータへのアクセス権限を付与する認証情報を使用する必要があります。 最も簡単な方法は、URLに認証情報データを含める基本認証です。 この方法は安全性が低いため、開発時のみ使用してください。 本番環境では、アプリケーションは OAuth2 を介してユーザーを認証する必要があります。
以下の例では、 cURL を使用しています。
基本認証を使用したサービス呼び出し(開発時のみ)
基本認証を使用してサービスを呼び出すには、URLに資格情報を指定します。
curl "http://localhost:8080/o/headless-delivery/v1.0/sites/20122/blog-postings/" -u 'test@liferay.com:learn'
OAuth2を使用してサービスを呼び出す
本番環境では、 OAuth2 アプリケーション を作成し、OAuth2 プロセスを使用して認証トークンを取得します。 トークンを取得したら、それをHTTPヘッダーに指定します。
curl -H "Authorization: Bearer d5571ff781dc555415c478872f0755c773fa159" http://localhost:8080/o/headless-delivery/v1.0/sites/20122/blog-postings
データの取得と投稿
上記のクエリを実行してすべてのブログ投稿を取得すると、何も見つからないことがわかります。
{
"actions" : {
"subscribe" : {
"method" : "PUT",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/{siteId}/blog-postings/subscribe"
},
"unsubscribe" : {
"method" : "PUT",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/{siteId}/blog-postings/unsubscribe"
},
"create" : {
"method" : "POST",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/{siteId}/blog-postings"
}
},
"items" : [ ],
"lastPage" : 1,
"page" : 1,
"pageSize" : 20,
"totalCount" : 0
}
まず、ブログ記事を投稿してください。
ブログエントリーの投稿
スキーマブラウザーを使用して、ブログエントリを投稿する方法を学ぶことができます。

-
スキーマブラウザを含むブラウザタブに戻ります。 右側にある
BlogPostingエントリーをクリックして、そのスキーマを表示します(上記を参照)。 これはBlogPostingデータ構造全体を示していますが、必須フィールドは2つだけです。articleBodyheadline
-
ブログエントリを投稿する単純なJSONドキュメントを作成します。
{ "headline": "Test Blog Entry from REST Services", "articleBody": "This article was posted via REST services provided by Liferay DXP." } -
リクエストを行います。
curl --header "Content-Type: application/json" --request POST --data '{ "headline": "Test Blog Entry from REST Services", "articleBody": "This article was posted via REST services provided by Liferay DXP." }' http://localhost:8080/o/headless-delivery/v1.0/sites/20122/blog-postings -u test@liferay.com:learn
Liferay DXPは、ブログエントリーの完全なJSON表現を返します。
{
"actions" : {
"get" : {
"method" : "GET",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
},
"replace" : {
"method" : "PUT",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
},
"update" : {
"method" : "PATCH",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
},
"delete" : {
"method" : "DELETE",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
}
},
"alternativeHeadline" : "",
"articleBody" : "This article was posted via REST services provided by Liferay DXP.",
"creator" : {
"additionalName" : "",
"contentType" : "UserAccount",
"familyName" : "Test",
"givenName" : "Test",
"id" : 20125,
"name" : "Test Test",
"profileURL" : "/web/test"
},
"customFields" : [ ],
"dateCreated" : "2020-03-06T18:02:26Z",
"dateModified" : "2020-03-06T18:02:27Z",
"datePublished" : "2020-03-06T18:02:00Z",
"description" : "",
"encodingFormat" : "text/html",
"friendlyUrlPath" : "test-blog-entry-from-rest-services",
"headline" : "Test Blog Entry from REST Services",
"id" : 35215,
"keywords" : [ ],
"numberOfComments" : 0,
"relatedContents" : [ ],
"siteId" : 20122,
"taxonomyCategories" : [ ]
}
すべてのブログエントリーを取得する
ここで、最初のクエリを繰り返して、投稿したブログエントリが表示されることを確認できます。
curl "http://localhost:8080/o/headless-delivery/v1.0/sites/20122/blog-postings/" -u 'test@liferay.com:learn'
ブログエントリのリストが返されます。 追加したエントリは、リスト内の唯一のエントリです。
{
"actions" : {
"subscribe" : {
"method" : "PUT",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/{siteId}/blog-postings/subscribe"
},
"unsubscribe" : {
"method" : "PUT",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/{siteId}/blog-postings/unsubscribe"
},
"create" : {
"method" : "POST",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/sites/{siteId}/blog-postings"
}
},
"items" : [ {
"actions" : {
"get" : {
"method" : "GET",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
},
"replace" : {
"method" : "PUT",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
},
"update" : {
"method" : "PATCH",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
},
"delete" : {
"method" : "DELETE",
"href" : "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/{blogPostingId}"
}
},
"alternativeHeadline" : "",
"articleBody" : "This article was posted via REST services provided by Liferay DXP.",
"creator" : {
"additionalName" : "",
"contentType" : "UserAccount",
"familyName" : "Test",
"givenName" : "Test",
"id" : 20125,
"name" : "Test Test",
"profileURL" : "/web/test"
},
"customFields" : [ ],
"dateCreated" : "2020-03-06T18:02:26Z",
"dateModified" : "2020-03-06T18:02:27Z",
"datePublished" : "2020-03-06T18:02:00Z",
"description" : "",
"encodingFormat" : "text/html",
"friendlyUrlPath" : "test-blog-entry-from-rest-services",
"headline" : "Test Blog Entry from REST Services",
"id" : 35215,
"keywords" : [ ],
"numberOfComments" : 0,
"relatedContents" : [ ],
"siteId" : 20122,
"taxonomyCategories" : [ ]
} ],
"lastPage" : 1,
"page" : 1,
"pageSize" : 20,
"totalCount" : 1
}
単一のブログエントリーを取得する
リクエストを行うたびに、Liferay DXPは他の考えられるエンドポイントを返します。 そのうちの1つは、IDによって単一のブログエントリを取得することです。 エントリーのIDがわかっている場合は、それを取得できます。
curl "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/35215" -u test@liferay.com:learn
同じブログエントリーを返します。
ブログエントリーを削除する
IDがわかっている場合は、ブログエントリーを削除することもできます。
curl -X DELETE "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/35215" -u test@liferay.com:learn
この場合、何も返されませんが、上記のようにリクエストすることで、エントリーが削除されたことを確認できます。
curl "http://localhost:8080/o/headless-delivery/v1.0/blog-postings/35215" -u test@liferay.com:learn
次に、Liferay DXPは、応答として次のJSONドキュメントを返します。
{
"status" : "NOT_FOUND",
"title" : "No BlogsEntry exists with the primary key 35215"
}
Liferay DXPのRESTサービスを呼び出す方法を学びました。 上記の例では基本認証を使用していることに注意してください。本番環境では、OAuth2を使用して安全な方法でサービスを呼び出します。