ContentfulのREST APIで複数コンテンツモデルの記事をまとめて取得する方法

2023.09.30

ヘッドレスCMSのContentfulで提供されるREST APIでは、記事を様々な条件で取得できます。

Contentfulでは「コンテンツモデル」という記事の型/フィールドを定義し、それに沿って記事を投稿しますが、APIでも特定のモデルに属する記事を指定して取得できます。

今回は「複数のモデルの記事を一度に取得したい」ケースの方法を紹介します。

1. パラメーター sys.contentType.sys.id でフィルターする

RESTで記事を取得する際 content_type=を指定できるのですが、そのままでは複数指定ができません。

1つのモデルの記事を取得する場合

https://cdn.contentful.com/spaces/{space_id}/entries?access_token={access_token}&content_type={content_model_id}

なので、記事のメタデータを間接的に使います。

複数のモデルの記事を取得する場合

https://cdn.contentful.com/spaces/{space_id}/entries?access_token={access_token}&sys.contentType.sys.id[in]={content_model_id1},{content_model_id2}

[in] はカンマで区切った複数の値のいずれかが含まれている記事をフィルターします。

[in]content_type パラメータには直接使えませんが、sys フィールドに対しては有効なため、sys 内の content_type フィールドに対してフィルターをかけています。

他にも...

  • [all] ... カンマ区切りで指定した値のセットに合致する記事を取得(特定のタグセットを持っているかなど)
  • [ne] ... 指定したパターンに一致する記事を 除外 して取得
  • [nin] ... カンマ区切りで指定した値のセットに対して、少なくとも一つ 一致しない項目がある記事を取得

対象のフィールドによって使えるパラメータ/演算子は異なるため、詳しくは下記をお読みください。

Contentful API - Search parameters

2. パラメーター include で関連しあう記事を取得する

もし複数のモデルの記事が相互にリンクし合っている場合、それらを一度に取得できます。

そのためには include パラメーターを使い、リンクを取得する階層を指定 します。

※「リンクし合う」とは、Contentfulでいう Reference 型のフィールドによって、記事が別のある記事に紐付けられている状態を指します。

例えば下記の構造だった場合...

  • モデル Parent の 記事A の中に、モデル Child の 記事B が紐づけられている 
  • 記事B の中に、モデル Grandchild の 記事C が紐づけられている 

上記の前提で、記事Aに対するリクエストで記事Cの中身まで取得したい場合、include=2 をパラメータに追加します。

Request

https://cdn.contentful.com/spaces/{space_id}/entries?access_token={access_token}&content_type=Parent&include=2

子記事以下の内容はレスポンス ↓ 内 includes キーに格納されます。

Response(長いので一部割愛します)

{
    ...
    "items": [ ...{ 記事A (親) の中身 } ],
    "includes": {
        "Entry": [
            {
                "sys": {
                    "id": "grandchild-entry", //記事C (孫)
                    "type": "Entry",
                    "contentType": {
                        "sys": {
                            "type": "Link",
                            "linkType": "ContentType",
                            "id": "grandchild"
                        }
                    },
                },
                "fields": {
                    "title": "記事C (孫)",
                }
            },
            {
                "sys": {
                    "id": "child-entry", //記事B (子)
                    "type": "Entry",
                    "contentType": {
                        "sys": {
                            "type": "Link",
                            "linkType": "ContentType",
                            "id": "child"
                        }
                    },
                },
                "fields": {
                    "title": "記事B (子)",
                    "child": {
                        "sys": {
                            "type": "Link",
                            "linkType": "Entry",
                            "id": "grandchild-entry"
                        }
                    }
                }
            }
        ]
    }
}

"includes": {} の中に孫記事C、子記事Bが含まれていますね。

なお使用時にはいくつか留意点があります。

  • include で指定できるのは 4 階層まで
  • トータル1000のReferenceまで
  • 単一記事取得時にはパラメータ無効

細かい条件は下記から:

最後に

以上、REST APIで複数モデルの記事を一度に取得する方法の紹介でした。

参考情報