GraphQL APIの使用
Liferay DXP には、ほとんどのアプリケーション用の GraphQL API が含まれています。 GraphQL API は http://[host]:[port]/o/graphqlで利用できます。
消費方法は次の 3 つのステップで行います。
Liferay DXP 2025.Q3+ からは、 {siteId} を使用する GraphQL API エンドポイントも、サイトのキーまたは外部参照コードで機能します。 値が競合する場合は、次の順序で解決されます。
- サイトキー(デフォルトの言語でのサイト名)
- サイトID
- サイト外部参照コード
まず、Liferay DXP を実行して 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に変更します。
使用するサービスを特定する
-
http://localhost:8080/o/apiに移動します。 -
画面の右上にある GraphQL をクリックして、Liferay の GraphiQL ブラウザを開きます。

-
クリックしたボタンの下にある ドキュメント リンクをクリックします。 これでAPIを閲覧できます。
-
GraphQLでは、最初の操作を query 、2番目の操作を mutationと呼び、読み込みと書き込みを分離します。 まず最初にブログのエントリーを投稿したいので、 [mutation]をクリックします。 API リストが表示されます。
重要Liferay DXP 2024.Q2+/Portal GA120+ バージョン管理された名前空間付きGraphQL APIを使用すると、異なるAPIの操作間の名前の競合を回避し、各API操作のソースとバージョンを明確に示すことで可読性と保守性を高め、アプリケーションが進化するAPIと互換性を維持できるようにすることで、互換性の問題のリスクと頻繁な更新の必要性を軽減できます。
バージョン管理された API 呼び出しは、バージョン管理されていない API 呼び出しと同様に機能します。 唯一の違いは、クエリに名前空間レベルが追加されていることです。 両方の例を以下に示します。
バージョン付きとバージョンなしの両方の GraphQL API を使用できますが、バージョンなしの API は 非推奨 であり、将来削除されることに注意してください。
-
上部の検索を使用するか、下にスクロールして
createSiteBlogPostingの呼び出しを見つけます。createSiteBlogPosting( siteKey: String! blogPosting: InputBlogPosting ): BlogPostingLiferay DXP 2024.Q2+/Portal GA120+ または、
headlessDelivery_v1_0/MutationHeadlessDelivery_v1_0名前空間の下にあります。
スキーマを直接要求することで、ローカル インストールの API を検出することもできます。
curl 'http://localhost:8080/o/graphql' -H "Content-Type: application/json" --data '{"query":"query{ __schema{ queryType{ name fields{ name args{ name } description } } } }","variables":{}}'
この URL では認証は必要ありませんが、返されるスキーマを管理するのは非常に面倒です。 付属の GraphQL クライアントを使用することをお勧めします。

API では、エントリを投稿するブログを含むサイトを知る必要があるため、まずサイト ID を見つける必要があります。
データを含むサイトを特定する
-
http://localhost:8080にアクセスしてください。 -
グローバル メニュー
を開き、 コントロール パネル タブをクリックして、 サイト → サイトに移動します。 -
Liferay サイトの横にある アクション ボタン
をクリックし、 サイト設定に移動を選択します。 -
サイト構成に移動します。
サイトIDが[Details]セクションの上部に表示されます。 これは 20117のような整数です。
データにアクセスできる認証情報を使用してサービス呼び出しを行う
これで、電話をかけるのに必要なものがすべて揃いました。 すべての Web サービスには、要求しているデータへのアクセスを許可する資格情報を使用してアクセスする必要があります。 付属の GraphQL クライアントはブラウザを通じて認証します。 スタンドアロンクライアントを作成する予定の場合は、 OAuth2を介してユーザーを認証する必要があります。
開発中は、URLで資格情報データを渡す基本認証を使用する方がはるかに簡単です。 しかし、これは安全ではないので、 この方法をプロダクションに決して使用しないでください。
基本認証を使用したGraphQL APIの呼び出し(開発中のみ)
基本認証を使用してサービスを呼び出すには、URLに資格情報を指定します。
curl \
http://localhost:8080/o/graphql \
--data "{'query':'query {blogPostings(filter: \'\', page: 1, pageSize: 10, search: \'\', siteKey: \'20117\', sort: \'\'){ page items{ id articleBody headline creator{ name }}}}'}" \
--header "content-type: application/json" \
--request POST \
--user test@liferay.com:learn \
OAuth2を使用してサービスを呼び出す
OAuth2 での GraphQL の使用は、Liferay DXP 7.4 U77+/Liferay Portal 7.4 GA77+ でサポートされています。
本番環境では、 OAuth2 アプリケーション を作成し、OAuth2 プロセスを使用して認証トークンを取得します。 トークンを取得したら、それをHTTPヘッダーに指定します。
curl \
http://localhost:8080/o/graphql \
--data '{"query":"query {blogPostings(filter: \"\", page: 1, pageSize: 10, search: \"\", siteKey: \"20117\", sort: \"\"){ page items{ id articleBody headline creator{ name }}}}"}' \
--header "Authorization: Bearer d5571ff781dc555415c478872f0755c773fa159" \
--header 'content-type: application/json' \
--request POST \
データの取得と投稿
GraphQL クライアントの左上のウィンドウに、すべてのブログ エントリを取得する次のコードを配置します ( siteKeyの値を変更することを忘れないでください)。
query {
blogPostings(
filter: ""
page: 1
pageSize: 10
search: ""
siteKey: "20117"
sort: ""
) {
page
items {
id
articleBody
headline
creator {
name
}
}
}
}
Liferay DXP 2024.Q2+/Portal GA120+
または、 headlessDelivery_v1_0 名前空間を追加して、次のようなクエリを記述することもできます。
query {
headlessDelivery_v1_0 {
blogPostings(
filter: ""
page: 1
pageSize: 10
search: ""
siteKey: "20117"
sort: ""
) {
page
items {
id
articleBody
headline
creator {
name
}
}
}
}
}
再生ボタンをクリックして実行し、ブログエントリがないことを確認します。
{
"data": {
"blogPostings": {
"page": 1,
"items": []
}
}
}
さて、ブログ記事を投稿しましょう。
ブログエントリーの投稿
-
再度
http://localhost:8080/o/apiにアクセスしてリクエストを行います。 GraphQLをクリックします。 -
公開したいエントリを含む JSON ドキュメントを作成し、左下にあるクエリ変数ボックス (1) に配置します (ボックスを展開するには、下にスクロールして クエリ変数 をクリックする必要がある場合があります)。
{ "blog": { "articleBody": "This Blog entry was created by calling the GraphQL service!", "headline": "GraphQL Blog Entry" } } -
スキーマドキュメントに基づいて GraphQL クエリを作成し、GraphQL クライアントのウィンドウの左上にあるクエリ領域に配置します (2)。
mutation CreateBlog($blog: InputBlogPosting) { createSiteBlogPosting(blogPosting: $blog, siteKey: "20117") { headline articleBody id friendlyUrlPath } }Liferay DXP 2024.Q2+/Portal GA120+ または、
headlessDelivery_v1_0名前空間を追加して、次のようなクエリを記述することもできます。mutation CreateBlog($blog: InputBlogPosting) { headlessDelivery_v1_0 { createSiteBlogPosting(blogPosting: $blog, siteKey: "20117") { headline articleBody id friendlyUrlPath } } } -
上部の再生ボタンをクリックしてクエリを実行します。
追加したブログエントリが GraphQL クライアントの右側のペイン (3) に表示されます。
Liferay DXPは、ミューテーションでリクエストされたフィールドを含むブログエントリーのJSON表現を返します。
{
"data": {
"headlessDelivery_v1_0": {
"createSiteBlogPosting": {
"headline": "GraphQL Blog Entry",
"articleBody": "This Blog entry was created by calling the GraphQL service!",
"id": 32198,
"friendlyUrlPath": "graphql-blog-entry-3"
}
}
}
}

これらのリクエストは、cURL などの任意の Web クライアントで行うことができます。
curl --request POST --url http://localhost:8080/o/graphql -u test@liferay.com:learn --header 'content-type: application/json' --data '{"query":"mutation CreateBlog($blog: InputBlogPosting){ createSiteBlogPosting(blogPosting: $blog, siteKey: \"20117\" ) { headline articleBody id friendlyUrlPath } } ","variables":{"blog":{"articleBody":"This Blog entry was created by using cURL to call the GraphQL service!","headline":"cURL GraphQL Blog Entry"}},"operationName":"CreateBlog"}'
すべてのブログエントリーを取得する
これで、最初のクエリを繰り返すことができます。
query {
blogPostings(
filter: ""
page: 1
pageSize: 10
search: ""
siteKey: "20117"
sort: ""
) {
page
items {
id
articleBody
headline
creator {
name
}
}
}
}
Liferay DXP 2024.Q2+/Portal GA120+
または、 headlessDelivery_v1_0 名前空間を追加して、次のようなクエリを記述することもできます。
query {
headlessDelivery_v1_0 {
blogPostings(
filter: ""
page: 1
pageSize: 10
search: ""
siteKey: "20117"
sort: ""
) {
page
items {
id
articleBody
headline
creator {
name
}
}
}
}
}
Liferay DXPは、投稿したブログエントリーを含むJSONを返します。
{
"data": {
"blogPostings": {
"page": 1,
"items": [
{
"id": 32010,
"articleBody": "This Blog entry was created by calling the GraphQL service!",
"headline": "GraphQL Blog Entry",
"creator": {
"name": "Test Test"
}
}
]
}
}
}
単一のブログエントリーを取得する
単一のブログエントリーを取得するためのGraphQLスキーマからのAPI呼び出しには、パラメーターが1つしかありません。
blogPosting(
blogPostingId: Long
): BlogPosting
上記のクエリによりブログ投稿の ID が明らかになったため、必要な投稿のみを取得できます。
query {
blogPosting(blogPostingId: 32010) {
id
headline
articleBody
}
}
Liferay DXP 2024.Q2+/Portal GA120+
または、 headlessDelivery_v1_0 名前空間を追加して、次のようなクエリを記述することもできます。
query {
headlessDelivery_v1_0 {
blogPosting(blogPostingId: 32010) {
id
headline
articleBody
}
}
}
これをクライアントのウィンドウの左上にあるクエリ領域に貼り付けて、 再生 ボタンをクリックします。 同じブログエントリを返します。
{
"data": {
"blogPosting": {
"id": 32010,
"headline": "GraphQL Blog Entry",
"articleBody": "This Blog entry was created by calling the GraphQL service!"
}
}
}
ブログエントリーを削除する
ブログエントリの削除は、作成と同様にミューテーションです。 その呼び出しは、単一のブログエントリを取得するのとほぼ同じです。
deleteBlogPosting(
blogPostingId: Long
): Boolean
クライアントを使用して、次のような呼び出しを行うことができます。
mutation {
deleteBlogPosting(blogPostingId: 32010)
}
Liferay DXP 2024.Q2+/Portal GA120+
または、 headlessDelivery_v1_0 名前空間を追加して、次のようなクエリを記述することもできます。
mutation {
headlessDelivery_v1_0 {
deleteBlogPosting(blogPostingId: 32010)
}
}
この呼び出しは、成功または失敗を示すブール値をJSONドキュメントで返します。
{
"data": {
"deleteBlogPosting": true
}
}
これで、 これで、LiferayDXPのGraphQLサービスを呼び出す方法を習得しました。 上記の例では基本認証を使用していることに注意してください。本番環境では、OAuth2を使用して安全な方法でサービスを呼び出します。