RESTful Web Services と REST UIで始めるDrupal8 REST API入門2
前回、RESTful Web Services と REST UIで始めるDrupal8 REST API入門として Drupalコアに含まれているRESTリソースの有効化及びREST APIを叩いた際のレスポンス等の確認を行いました。
今回は、RESTのプラグインとして独自にAPIを実装し動作確認を行いたいと思います。
試しに基本ページコンテンツタイプ(コンテンツタイプID = 'page')の一覧を取得するプラグインを作成します。
モジュール構成
/modules/custom
ディレクトリ以下に下記構成でモジュールを作成します。
d8_rest_api_example
├── d8_rest_api_example.info.yml # Drupalにモジュールを認識させる為のinfo.yml
└── src
└── Plugin
└── rest
└── resource
└── PageList.php # RESTプラグイン
モジュール情報ファイル(d8_rest_api_example.info.yml)
モジュール情報ファイルは以下の通りです。
name: Drupal8 REST API example
description: REST API を利用したカスタムモジュール
type: module
core: 8.x
dependencies:
- rest
RESTプラグインファイル(PageList.php)
RESTプラグインのソースは以下になります。ソースの中で特に重要となる箇所は以下の通り。
- namespace…このネームスペースを指定することにより、RESTプラグインとしてDrupalが認識します。
- アノテーション…
@RestResource
を適切にしていすることにより、RESTプラグインとして機能します。- id... RESTプラグインのユニークなIDです。
- label...REST UIの管理画面に表示される、説明文です。
- uri_paths...
canonical
はGETでアクセスする際のURLを定義します。
create
を指定するとPOST(patch/delete)アクセス時のパスを指定可能です。
get()
関数... GETでアクセスが来た際の処理を定義します。同様にpost()
patch()
delete()
関数も定義可能です。
<?php
namespace Drupal\d8_rest_api_example\Plugin\rest\resource;
/**
* @file
* 基本ページコンテンツタイプのノード一覧を返すRESTプラグイン.
*/
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\node\Entity\NodeType;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
/**
* Class Page.
*
* @RestResource(
* id = "page_resource",
* label = "基本ページのノード一覧を返すAPI",
* uri_paths = {
* "canonical" = "/page"
* }
* )
*/
class PageList extends ResourceBase {
/**
* 基本ページのノード一覧を返すGETリクエストの処理.
*
* @return \Drupal\rest\ResourceResponse
* レスポンス.
*/
public function get() {
try {
// 基本ページ(コンテンツタイプ='page')コンテンツタイプの存在チェック.
if (empty(NodeType::load('page'))) {
throw new \Exception('Content Types Not Found.');
}
// デフォルトのレスポンスデータ定義.
$results = [
'count' => 0,
'data' => [],
];
// 基本ページ(コンテンツタイプ='page')のノード取得.
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties(['type' => 'page']);
// 取得件数をレスポンスデータにセット.
$results['count'] = count($nodes);
// 取得したノードより必要な情報を取り出す.
foreach ($nodes as $node) {
$results['data'][] = [
'nid' => $node->id(),
'title' => $node->label(),
];
}
// レスポンスデータをセット.
$response = new ResourceResponse($results);
// キャッシュ無効化.
$disable_cache = new CacheableMetadata();
$disable_cache->setCacheMaxAge(0);
$response->addCacheableDependency($disable_cache);
return $response;
}
catch (\Exception $e) {
// エラー発生時はエラーレスポンスを返す.
$response = ['error' => $e->getMessage()];
return new ResourceResponse($response, 403);
}
}
}
REST UI 管理画面
モジュールを有効化すると以下の通り、管理画面( /admin/config/services/rest
)上に定義したAPIが表示されます。
次に「有効」ボタンをクリックしメソッドや受け付けるフォーマット等を指定します。
有効化すると、「有効」に当APIが表示されます。
最後にOperationsの「権限」より、当APIへアクセスできる権限を設定します。
(例として匿名ユーザでもアクセス可能としています。実際は運用に合わせ権限を正しく設定してください。)
REST API の実行
事前に基本ページのコンテンツを3つ作成した状態で、今回定義したAPIを実行すると
以下の通り、実行結果が取得できます。
# curl '/page?_format=json' | jq . 10:45:20
{
"count": 3,
"data": [
{
"nid": "1",
"title": "test"
},
{
"nid": "2",
"title": "test2"
},
{
"nid": "3",
"title": "test3"
}
]
}
このように独自APIもRESTプラグインを利用することにより簡単に構築できます。
Drupal8でAPIを実装されたい方はご参考にしてください。
また、弊社ではDrupalは慣れていないが、APIとして利用したい等のご相談も受け付けております。
その他Drupalに関するお問い合わせも随時受け付けておりますので、何かございましたら弊社までお問い合わせください。
募集しています
スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。