DrupalのJSON:APIの使用方法(includeと多言語対応)
概要
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