包含リソースが含まれる応答のペイロード構造

特定の種類のリソースや関連リソースタイプについてクエリを行う機能を一部のエンドポイントでサポートしています。例えば、GET /activities エンドポイントのデフォルト動作では、アクティビティリソースのみを返します。ただし、include クエリパラメータを使用して、返されるアクティビティに関する備考・経緯を応答ペイロードに含めることができます。これらの種類のリソースは、包含リソースと呼ばれます。包含リソースを GET に追加する手法は、応答包含または読み取り包含と呼ばれることがあります。

包含リソースを追加する構文は以下のとおりです。

<endpointPath>?include=<resourceName>

上記の内容に関する説明を以下に示します。

  • <endpointPath> はデフォルトのパス(/common/v1/activities など)
  • <resourceName> は関連リソース名(notes など)

例えば、GET /activities?include=notes で返す内容は、現在のユーザーにアサインされているすべてのアクティビティと、そのアクティビティに関連付けられたすべての備考・経緯です。

1 つのクエリには、複数のリソースタイプを含めることができます。これを行うには、カンマ区切りリストでリソースを特定します。例えば、GET /claims?include=exposures,activities で返す内容は、現在のユーザーにアサインされたすべてのクレームと、そのクレームに関連付けられたすべてのエクスポージャーとアクティビティです。

include を使用して呼び出しを実行すると、応答ペイロードには主要リソースと包含リソースについての情報が含まれます。ただし、包含リソースに関する情報の大半は、主要リソースでインライン表示されません。代わりに、以下のようになります。

  • 各主要リソースには related セクションが用意されます。このセクションに、その主要リソースに関する包含リソースの ID(と種類)が一覧表示されます。ただし、各 related セクションには、そのリソースのその他の詳細は含まれません。
  • 包含リソースについての詳細は、ペイロード末尾の included というセクションに表示されます。

含まれるオブジェクトの ID は、related セクションと included セクションの両方に表示されます。これらの ID を使用して、包含リソースに関する詳細情報を含む主要リソースとの一致を検索できます。

包含リソースとインラインリソースとの違い

応答ペイロードには、ルートリソースと関係する 2 種類のリソースとしてインラインリソースと包含リソースを含めることができます。次の表に、2 つの種類のリソースの違いを示します。

リソースタイプ 各主要リソースの関連リソースの数 フィールドの表示場所 表示される場合
インラインリソース 通常は 1 つ(例えば、各アクティビティに関連付けられる assignedUser は 1 つだけ) すべてルートリソースの attributes セクション クエリで fields クエリパラメータを使用しない場合、各インラインリソースはデフォルト属性の 1 つである場合のみ表示される。

クエリで fields クエリパラメータを使用する場合、各インラインリソースは、そのクエリパラメータで指定されているかどうかに応じて、表示されるかどうかが決まる。

包含リソース 1 つ~多数(例えば、各 activity には複数の notes を関連付けることが可能) ID はルートリソースの related セクションに表示される。それ以外の属性は、ペイロード下部の included セクションに表示される。

クエリパラメータに ?include=resourceName クエリパラメータが含まれている場合

チュートリアル:包含リソースが含まれる Postman 要求の送信

このチュートリアルの前提事項は、Postman の環境を設定してあり適切なサンプルデータセットを用意していることです。詳細については、チュートリアル:Postman 環境のセットアップを参照してください。

チュートリアル手順

  1. Postman で、[Launchpad]タブの右側の[+]をクリックして、新しい要求を開始します。
    1. [権限]タブで、ユーザー名 aapplegate とパスワード gw を使用して、[Basic Auth]を選択します。
  2. GET を使用して、リソースおよび関連リソースのセットを取得できます。例えば、単一の GET で、クレームとそのすべての連絡先を取得できます。以下の GET では、クレーム 235-53-365870(パブリック ID は demo_sample:1)とその連絡先を取得します。Postman でこの URL を入力し、[送信]をクリックします。

    GET http://localhost:8080/cc/rest/claim/v1/claims/demo_sample:1?include=contacts

    応答ペイロードの以下の点に注目します。

    • data セクションは 2 行目から始まります。クレームに関する情報が含まれます。
    • included セクションは 363 行目かその前後から始まります。このクレームの連絡先の配列が含まれます。
  3. GET を使用して、リソースおよび単一の関連リソースを取得できます。例えば、単一の GET で、クレームとその主要な連絡先を取得できます。以下の GET では、クレーム 235-53-365870(パブリック ID は demo_sample:1)とその主要な連絡先を取得します。Postman でこの URL を入力し、[送信]をクリックします。

    GET http://localhost:8080/cc/rest/claim/v1/claims/demo_sample:1?include=mainContact

    応答ペイロードの以下の点に注目します。

    • data セクションは 2 行目から始まります。クレームに関する情報が含まれます。91 行目かその前後に、クレームの主要な連絡先についての情報があります。ただし、意味のある情報は、主要な連絡先の表示名と ID のみです。
    • included セクションは 339 行目かその前後から始まります。このクレームの単一の連絡先が含まれます。このセクションには、表示名と ID 以外にも、連絡先についての詳細情報があります。

包含リソースが含まれる応答の構造

包含リソースが含まれる応答の高度な構造は、以下に示すとおりです。包含リソースに特に関係する情報は、太字で表示されます。(注意:JSON ではコメントをサポートしません。ただし、コードを明確化するため、擬似コメントが追加されています。各擬似コメントの前にはハッシュタグ(#)が付きます。)

{
    "count": N,                        # Number of resources is payload
    "data": [                          # Details for each resource
        {                              # Resource 1 begins here
            "attributes": {            # Resource 1 name/value pairs
                "propertyName": "propertyValue",
                ... },
            "checksum": "val",         # Resource 1 checksum value
            "links": {                 # Links relevant to Resource 1
                ... },
            "related": {              # List of resources related to R1
                "resourceType": {      # Related resource type
                    "count": NN,       # Number of related resources for R1
                    "data": [
                        {              # First resource related to R1 starts
                            "id": "relatedResourceID",
                            "type": "resourceType"
                        },             # First resource related to R1 ends
                        ...            # Other resources related to R1
                    ] } }
        },                             # Resource 1 ends here
        {                              # Resource 2 begins here
            "attributes": {            # Recourse 2 name/value pairs
                "propertyName": "propertyValue",
                ... },
            "checksum": "val",         # Resource 2 checksum value
            "links": {                 # Links relevant to Resource 2
                ... },
            "related": {               # List of resources related to R2
                "resourceType": {      # Related resource type
                    "count": NN,       # Number of related resources for R2
                    "data": [
                        {              # First resource related to R2 starts
                            "id": "relatedResourceID",
                            "type": "resourceType"
                        },             # First resource related to R2 ends
                        ...            # Other resources related to R2
                    ] } }
        },                             # Resource 2 ends here
        ... ],                         # Resources 3 to N
    "links": {                         # Links relevant to collection
             ...
        },
    "included": {                      # List of related resources
        "resourceType": [              # First related resource type
            {
                "attributes": {        # Related resource 1 start
                    ...                # Related resource 1 name/value pairs
                    "id": " relatedResourceID ",
                    ... },
                "checksum": "0",       # Related resource 1 checksum value
                "links": { ... }       # Links relevant to Related resource 1
            },
            ...                        # Related resources 2 to end
    ] }
}

related セクション(リソース)

各リソースには、以下を特定する追加の related セクションがあります。

  • 包含リソースの数、および
  • 包含リソースの ID

例えば、以下のコードスニペットは、すべてのアクティビティと関連の備考・経緯のクエリの応答からの抜粋です。アクティビティ xc:44 には備考・経緯が 1 つ含まれ、その ID は xc:55 です。

{
    "attributes": {
        ...
        "id": "xc:44",
        ...
        "subject": "Check coverage"
    },
    "checksum": "2",
    "links": {
        ...
    },
    "related": {
        "notes": {
            "count": 1,
            "data": [
                {
                    "id": "xc:55",
                    "type": "Note"
                }
            ]
         }
      }
},

GET で included クエリパラメータを使用するが、関連リソースが存在しない場合でも、related セクションは引き続き表示されます。ただし、カウントは 0、data セクションは空白です。例:

"related": {
    "notes": {
        "count": 0,
        "data": []
    }
}

GET で included クエリパラメータを省略すると、related セクションが応答ペイロードから省略されます。

included セクション(応答)

各応答には included セクションがあり、応答ペイロードの末尾に表示されます。このセクションには、主要リソースの各包含リソースについての詳細情報が一覧表示されます。

例えば、以下のコードスニペットは、前出の例の included セクションのものです。

"included": {
    "Note": [
        {
        "attributes": {
            "author": {
                "displayName": "Betty Baker",
                "id": "demo_sample:8"
            },
            "bodySummary": "Main contact is on vacation 03/20",
            "confidential": false,
            "createdDate": "2020-03-30T23:11:33.346Z",
            "id": "xc:55",
            "relatedTo": {
                "displayName": "235-53-373871",
                "id": "demo_sample:8002",
                "type": "Claim"
            },
            "subject": "Main contact is on vacation 03/20",
            "topic": {
                "code": "general",
                "name": "General"
            },
        "updateTime": "2020-03-30T23:12:08.892Z"
        },
            "checksum": "0",
            "links": {
                "self": {
                    "href": "/common/v1/notes/xc:55",
                    "methods": [
                        "get",
                        "patch"
                    ]
                }
            }
        }
    ]
},

アクティビティ xc:44 には備考・経緯が 1 つ含まれていることを思い出してください。含まれている備考・経緯の ID は xc:55 です。included セクションに表示される備考・経緯は、アクティビティ xc:44 に関連する備考・経緯です。

コレクションまたは特定リソースの包含

特定のエンドポイントに対して、include オプションのいくつかは、プライマリリソースごとにリソースのコレクションを返します。それ以外の include オプションは、プライマリリソースごとに 1 つのリソースを返します。

最初のケースの例は、GET /claims/{claimId}?include=contacts です。この呼び出しで返される内容は、特定のクレーム ID を持つクレームと、そのクレームに関連するすべてのクレーム連絡先です。理論的には、プライマリリソース(特定のクレーム ID を持つクレーム)ごとに、関連するリソース(クレーム連絡先)が複数存在します。

2 番目のケースの例は、GET /claims/{claimId}?include=mainContact です。この呼び出しで返される内容は、特定のクレーム ID を持つクレームと、主要な連絡先として指定されているクレーム連絡先です。プライマリリソース(特定のクレーム ID を持つクレーム)ごとに、関連するリソース(主要なクレーム連絡先)が 1 つのみ存在します。

GET /claims/{claimId}?include=contacts,mainContact のように、複数の include オプションを指定することもできます。この場合、クレームごとに、関連セクションが、すべての関連連絡先の ID を指定し、さらに、主要な連絡先の ID も明示的に特定します。

一般ルールとして、include オプションが複数指定されている場合、プライマリリソースごとにリソースのセットが返されます。include オプションが単数指定されている場合、プライマリリソースごとに 1 つのリソースが返されます。

包含可能なリソースの決定

エンドポイントごとに、エンドポイントの API 定義を参照することで、含めることができるリソースを決定できます。データエンベロープのモデルで名前の末尾が「...Inclusions」になります。このデータエンベロープでリストされるすべてのリソースに含めることができる場合は、そのタイプのリソースに対してクエリを実行するときです。

例えば、Common API では、GET /activities のモデルは、ActivityResponseInclusions 要素を参照します。この要素には、1 つの子要素である Note があります。アクティビティのクエリで含めることができる要素の唯一のタイプが notes であることを意味します。

特定のエンドポイントで包含に対してサポートされていないリソースタイプを含めようとすると、API から 400 エラーコードおよびメッセージが返されます。例えば、GET /activities?include=users を実行しようとした場合、以下のメッセージが返されます。

"userMessage": "Bad value for the 'include' query parameter - The requested
inclusions '[users]' are not valid for this resource. The valid options are [notes]."