---
title: コンテンツカテゴリ毎にキャッシュがクリアされるリストのエンドポイントを作成する
description: このチュートリアルでは、API::api_request エンドポイントで Topics::list をラップし、コンテンツカテゴリごとにキャッシュがクリアされる仕組みを持つリスト用エンドポイントの作成方法を解説します。
---

## 概要
管理画面からコンテンツを更新すると、同じコンテンツ定義IDが設定されたTopicsのエンドポイントのキャッシュがクリアされます。
そのため、Topics::listのエンドポイントは、コンテンツが更新されるたびにキャッシュがクリアされ、常に最新のデータが取得される仕組みです。

しかし、キャッシュをそこまで頻繁にクリアする必要がない場合や、同一カテゴリ内でのみキャッシュをクリアしたい場合には、
API::api_request エンドポイントで Topics::list をラップする方法が有効です。これにより、コンテンツの更新時にキャッシュがクリアされなくなり、キャッシュのヒット率を高めることができます。
（ただし、この方法を採用する場合は、キャッシュの管理を独自に設計・設定する必要がある点に留意してください。）

たとえば、Topics::list を使用してカテゴリ（content_type）を指定している場合でも、コンテンツ定義IDが同じであれば、別のカテゴリのコンテンツ更新によってもキャッシュがクリアされてしまいます。

このチュートリアルでは、API::api_request エンドポイントで Topics::list をラップし、コンテンツカテゴリごとにキャッシュがクリアされる仕組みを持つリスト用エンドポイントの作成方法を解説します。

### 学べること
以下の手順で独自にキャッシュの制御を行うエンドポイントを作成します。
- [Topics::listをラップするエンドポイントを作成する](#topicslistをラップするエンドポイントを作成する)
- [キャッシュのクリアをするトリガーを設定する](#キャッシュのクリアをするトリガーを設定する)

### 前提条件
- Topics::listのエンドポイントが無い場合は事前に作成してください。
- コンテンツカテゴリは1コンテンツに1つ設定する運用を想定します。

## Topics::listをラップするエンドポイントを作成する
### カスタム処理を作成する

まず、Topics::listをラップするためのカスタム処理を作成します。
[オペレーション] -> [カスタム処理] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/45a3b82e8fec3d1ad46a72c0bf8d394b.png)

画面右上の [追加] ボタンをクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/471bc146570ff60efb362ece59b7fbe1.png)

カスタム処理編集画面で以下の設定を行います：

| 項目 | 入力値 |
| :--- | :--- |
| タイトル | `get_topics_list_by_category` |
| 識別子 | `get_topics_list_by_category` |
| 処理 | 以下の内容 |

```smarty
{api_internal
    endpoint='/rcms_api/1/topics/list/1'
    method='GET'
    query="contents_type[]=`$smarty.request.data_id`"
    direct=true
    var='response'
    status_var='status'}

{assign var="data" value=$response}
```

:::caution
エンドポイントはご自身の環境で利用するTopics::listのエンドポイントを指定してください。
:::

![Image from Gyazo](https://t.gyazo.com/teams/diverta/a66b41d87f9bcc0c2f00eb4bbc671c80.png)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/1f1e226038de72afeab84efefb3f9805.png)

[追加する] ボタンをクリックしてカスタム処理を追加します。

### エンドポイントを作成する

次に、作成したカスタム処理を呼び出すAPI::api_requestエンドポイントを作成します。

ご利用のエンドポイント一覧画面に遷移します。  
ここでは、[API] -> [Default] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/a6f8cae1d30e40c100cf114feb8f9944.png)

[追加] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/e4d1bcc9d51961220ec5fa934c66b266.png)

エンドポイント設定ダイアログで以下を設定し、[追加する] をクリックして保存します。

| 項目 | 設定内容 |
| :--- | :--- |
|パス|	topics/list/wrapper |
|カテゴリー| API |
|モデル| Api |
|オペレーション| request_api |
|キャッシュ|86400|
|name|カスタム処理の識別子(get_topics_list_by_category)|
|use_path_param|有効にする|

![Image from Gyazo](https://t.gyazo.com/teams/diverta/4b05d6ada682c741dd4e36d1be28415e.png)


### 動作確認

作成したエンドポイントの動作を確認します。
API一覧画面で [Swagger UI] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/c1f7b355a07ff160d5c5cbcb71720706.png)

作成した `topics/list/wrapper` エンドポイントを選択します。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/57763f36d1f49f3c166e49a498f40098.png)

[Try it out] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/d7ab203317ef292d6eb5fa3311af6e17.png)

data_idに任意のカテゴリIDを入力し、[Execute] をクリックして実行します。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/793f07a7268588d66a5380ad942fde78.png)

レスポンスコードが200で正常に応答されること、また、2回目以降のリクエストに対してはレスポンスヘッダーの Age に値が設定されており、キャッシュが利用されていることを確認してください。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/5f605f113883308235f776e2a6caeabb.png)

## キャッシュのクリアをするトリガーを設定する

### カスタム処理を作成する

コンテンツ更新時に特定のURLのエンドポイントのみキャッシュクリアをするトリガー用のカスタム処理を作成します。  
[オペレーション] -> [カスタム処理] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/45a3b82e8fec3d1ad46a72c0bf8d394b.png)

画面右上の [追加] ボタンをクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/471bc146570ff60efb362ece59b7fbe1.png)

カスタム処理編集画面で以下の設定を行います：

| 項目 | 入力値 |
| :--- | :--- |
| タイトル | `clear_wrapped_endpont_cash` |
| 識別子 | `clear_wrapped_endpont_cash` |
|トリガー|<ul><li>モジュール：コンテンツ</li><li>トリガー：コンテンツの更新後</li><li>対象：任意のコンテンツ定義</li></ul>|
| 処理 | 以下の内容 |

```smarty
{assign_topics_detail var='topics_data' topics_id=$topics_id }
{purge_cdn_cache api_endpoint="/rcms-api/1/topics/list/wrapper/`$topics_data.contents_type`"}
```

:::caution
エンドポイントはご自身の環境で利用するTopics::listのエンドポイントを指定してください。
:::

![Image from Gyazo](https://t.gyazo.com/teams/diverta/ba67d58e6e08df9f29498584367be5dc.png)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/7913ac54895aa3b7c0fc44bd4ea5465d.png)

[追加する] ボタンをクリックしてカスタム処理を追加します。

### 動作確認

トリガーの動作を確認します。  
対象のコンテンツ定義でコンテンツを更新します。

更新後、該当カテゴリのエンドポイントのキャッシュがクリアされていることを確認します。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/fd2a96e8bb6cc93fe6a3098cd2520e00.png)

他のカテゴリのキャッシュは影響を受けていないことを確認します。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/6afaf5efbb3825e9fa22543a96957552.png)


以上で、Topics::list をラップし、コンテンツカテゴリごとにキャッシュがクリアされる仕組みを持つリスト用エンドポイントの作成は環境です。
本チュートリアルでは、コンテンツの更新時にのみキャッシュクリアを実行しています。コンテンツの追加時など、別のタイミングでもキャッシュをクリアしたい場合は、必要なトリガーを設定したカスタム処理を作成してください。

## 関連ドキュメント

- [エンドポイントの設定方法](/docs/tutorials/configure-endpoint/)
- [カスタム処理と紐づいたAPIエンドポイントを作成する](/docs/tutorials/creating-a-custom-function-endpoint/)
- [APIキャッシュクリアのタイミングと範囲](/docs/reference/cache-clear-operation/)
- [カスタム処理に利用できるトリガと変数の一覧](/docs/reference/trigger-variables/)
- [Smartyプラグイン](/docs/reference/smarty-plugin/)