🔖

DrupalのJSON:APIの使用方法(includeと多言語対応)

2023/06/09に公開

概要

DrupalのJSON:APIの使用方法に関する備忘録です。今回は、タクソノミーなどに対するincludeと多言語処理について記載します。

データ

以下のように、positionフィールドにタクソノミー「助教」を付与しています。

/node/5

また、コンテンツの多言語化を有効にしており、以下のように、タイトルとpositionの英語も表示されます。

/en/node/5

JSON:API

上記のコンテンツをコンテンツタイプ「faculty」に作成したので、以下のURLから、データの一覧を取得できます。

/jsonapi/node/faculty/

以下は、linksフィールドを除く結果を表示しています。field_positionにタクソノミーのIDが含まれていますが、当該タクソノミーのラベル等はふくまれていません。

{
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
        "self": {
          "href": "http://jsonapi.org/format/1.0/"
        }
      }
    }
  },
  "data": [
    {
      "type": "node--faculty",
      "id": "586ef1d9-b680-41f9-b54b-7ebcdc9d154f",
      "attributes": {
        "drupal_internal__nid": 5,
        "drupal_internal__vid": 13,
        "langcode": "ja",
        "revision_timestamp": "2023-06-08T01:01:43+00:00",
        "revision_log": null,
        "status": true,
        "title": "中村覚",
        "created": "2023-06-08T00:44:15+00:00",
        "changed": "2023-06-08T01:01:26+00:00",
        "promote": true,
        "sticky": false,
        "default_langcode": true,
        "revision_translation_affected": null,
        "content_translation_source": "und",
        "content_translation_outdated": false,
        "path": {
          "alias": null,
          "pid": null,
          "langcode": "ja"
        },
        "body": null
      },
      "relationships": {
        "node_type": {
          "data": {
            "type": "node_type--node_type",
            "id": "841962f7-91c8-47a1-b335-ea494efe467c",
            "meta": {
              "drupal_internal__target_id": "faculty"
            }
          }
        },
        "revision_uid": {
          "data": {
            "type": "user--user",
            "id": "0b001e4d-ed29-4a53-960d-9cdcc3d3ad70",
            "meta": {
              "drupal_internal__target_id": 1
            }
          }
        },
        "uid": {
          "data": {
            "type": "user--user",
            "id": "0b001e4d-ed29-4a53-960d-9cdcc3d3ad70",
            "meta": {
              "drupal_internal__target_id": 1
            }
          }
        },
        "field_position": {
          "data": {
            "type": "taxonomy_term--position",
            "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
            "meta": {
              "drupal_internal__target_id": 5
            }
          }
        }
      }
    }
  ]
}

includeを使う

クエリに、?include=field_positionを追加します。結果、以下のように、includedフィールドが追加され、タクソノミータームのnameフィールドの値も得ることができました。

{
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
        "self": {
          "href": "http://jsonapi.org/format/1.0/"
        }
      }
    }
  },
  "data": [
    {
      "type": "node--faculty",
      "id": "586ef1d9-b680-41f9-b54b-7ebcdc9d154f",
      "attributes": {
        "drupal_internal__nid": 5,
        "drupal_internal__vid": 13,
        "langcode": "ja",
        "revision_timestamp": "2023-06-08T01:01:43+00:00",
        "revision_log": null,
        "status": true,
        "title": "中村覚",
        "created": "2023-06-08T00:44:15+00:00",
        "changed": "2023-06-08T01:01:26+00:00",
        "promote": true,
        "sticky": false,
        "default_langcode": true,
        "revision_translation_affected": null,
        "content_translation_source": "und",
        "content_translation_outdated": false,
        "path": {
          "alias": null,
          "pid": null,
          "langcode": "ja"
        },
        "body": null
      },
      "relationships": {
        "node_type": {
          "data": {
            "type": "node_type--node_type",
            "id": "841962f7-91c8-47a1-b335-ea494efe467c",
            "meta": {
              "drupal_internal__target_id": "faculty"
            }
          }
        },
        "revision_uid": {
          "data": {
            "type": "user--user",
            "id": "0b001e4d-ed29-4a53-960d-9cdcc3d3ad70",
            "meta": {
              "drupal_internal__target_id": 1
            }
          }
        },
        "uid": {
          "data": {
            "type": "user--user",
            "id": "0b001e4d-ed29-4a53-960d-9cdcc3d3ad70",
            "meta": {
              "drupal_internal__target_id": 1
            }
          }
        },
        "field_position": {
          "data": {
            "type": "taxonomy_term--position",
            "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
            "meta": {
              "drupal_internal__target_id": 5
            }
          }
        }
      }
    }
  ],
  "included": [
    {
      "type": "taxonomy_term--position",
      "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
      "attributes": {
        "drupal_internal__tid": 5,
        "drupal_internal__revision_id": 5,
        "langcode": "ja",
        "revision_created": "2023-06-08T01:00:31+00:00",
        "revision_log_message": null,
        "status": true,
        "name": "助教",
        "description": null,
        "weight": 0,
        "changed": "2023-06-08T01:00:31+00:00",
        "default_langcode": true,
        "revision_translation_affected": true,
        "content_translation_source": "und",
        "content_translation_outdated": false,
        "content_translation_created": "2023-06-08T01:00:31+00:00",
        "path": {
          "alias": null,
          "pid": null,
          "langcode": "ja"
        }
      },
      "relationships": {
        "vid": {
          "data": {
            "type": "taxonomy_vocabulary--taxonomy_vocabulary",
            "id": "450e8e85-4866-4373-97c2-db259ac381ff",
            "meta": {
              "drupal_internal__target_id": "position"
            }
          }
        },
        "revision_user": {
          "data": null
        },
        "parent": {
          "data": [
            {
              "type": "taxonomy_term--position",
              "id": "virtual"
            }
          ]
        },
        "content_translation_uid": {
          "data": {
            "type": "user--user",
            "id": "0b001e4d-ed29-4a53-960d-9cdcc3d3ad70",
            "meta": {
              "drupal_internal__target_id": 1
            }
          }
        }
      }
    }
  ]
}

さらに、fieldsクエリを使用すると、以下のように、取得結果を小さくすることができます。

/jsonapi/node/faculty/?include=field_position&fields[node--faculty]=title,field_position&fields[taxonomy_term--position]=name

{
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
        "self": {
          "href": "http://jsonapi.org/format/1.0/"
        }
      }
    }
  },
  "data": [
    {
      "type": "node--faculty",
      "id": "586ef1d9-b680-41f9-b54b-7ebcdc9d154f",
      "attributes": {
        "title": "中村覚"
      },
      "relationships": {
        "field_position": {
          "data": {
            "type": "taxonomy_term--position",
            "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
            "meta": {
              "drupal_internal__target_id": 5
            }
          }
        }
      }
    }
  ],
  "included": [
    {
      "type": "taxonomy_term--position",
      "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
      "attributes": {
        "name": "助教"
      }
    }
  ]
}

多言語対応

言語をURLに追記するだけで、当該言語のデータを取得できました。

/en/jsonapi/node/faculty/?include=field_position&fields[node--faculty]=title,field_position&fields[taxonomy_term--position]=name

{
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
        "self": {
          "href": "http://jsonapi.org/format/1.0/"
        }
      }
    }
  },
  "data": [
    {
      "type": "node--faculty",
      "id": "586ef1d9-b680-41f9-b54b-7ebcdc9d154f",
      "attributes": {
        "title": "Satoru Nakamura"
      },
      "relationships": {
        "field_position": {
          "data": {
            "type": "taxonomy_term--position",
            "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
            "meta": {
              "drupal_internal__target_id": 5
            }
          }
        }
      }
    }
  ],
  "included": [
    {
      "type": "taxonomy_term--position",
      "id": "6ce458e8-6d79-4ed1-9653-5ec178568b7a",
      "attributes": {
        "name": "assistant professor"
      }
    }
  ]
}

まとめ

様々な機能が実装されていて、とても便利だと思いました。他の方の参考になりましたら幸いです。

Discussion