コンポジット要求の構成

/composite エンドポイント

コンポジット要求を作成するには、Composite API で /composite エンドポイントを使用します。これはバッチと異なります。各 API には独自の /batch エンドポイントがあります。ただし、すべての Cloud API で /composite エンドポイントは 1 つだけで、Composite API にあります。

コンポジット要求呼び出しの構文は次のとおりです。

POST <applicationURL>/rest/composite/v1/composite

コンポジット要求のセクション

コンポジット要求では、以下の 2 つまでのセクションを使用できます。

  • requests セクションには、データをコミットするサブ要求が含まれます。
  • selections セクションには、データのクエリを行うサブ選択が含まれます。サブ要求の後、すべてのサブ要求がデータのコミットに成功した場合にのみ実行されます。

高度なレベルでは、これらのセクションの構文は以下のようになります。

{
  "requests": [
    {
      <subrequest 1>
    },
    {
      <subrequest 2>
    },
    ...
  ],
  "selections": [
    {
      <subselection 1>
    },
    {
      <subselection 2>
    },
    ...
  ]
}

requests セクション

requests セクションでサポートされる操作は、POST、PATCH、および DELETE のみです。これには、データを作成する POST とビジネスアクションを実行する POST(POST /assign など)の両方が含まれます。

requests セクションの基本的な構文は以下のとおりです。

{
  "requests": [
    {
      "method": "<post/patch/delete>",
      "uri": "<path>",
      "body": {
        "data": {
          "attributes": {
            "<field1>": "<value1>",
            "<field2>": "<value2>",
            ...
            }
        }
      }
    }, 
    {
      <next subrequest>
    },
    ...
    {
      <final subrequest>
    }
  ]
}

例えば、以下の単純なコンポジット要求では、アクティビティ xc:202 で 2 つの備考・経緯を作成します。

POST <applicationURL>/rest/composite/v1/composite

{
  "requests": [   
    {
      "method": "post",
      "uri": "/common/v1/activities/xc:202/notes",
      "body": {
        "data": {
          "attributes": {
            "body": "Cloud API note #1."
          }
        }
      }
    },    
    {
      "method": "post",
      "uri": "/common/v1/activities/xc:202/notes",
      "body": {
        "data": {
          "attributes": {
            "body": "Cloud API note #2."
          }
        }
      }
    }
  ]
}

すべてのコンポジット要求機能を含む完全な構文については、コンポジット要求の完全な構文を参照してください。

変数を使用してサブ要求間で情報を共有する方法

あるサブ要求の情報を、その後のサブ要求でも使用できます。これは、コンポジット変数を使用して実行できます。

変数の宣言

コンポジット変数は、サブ要求の vars セクションで宣言します。変数にはそれぞれ namepath があります。name は任意の文字列です。path は変数の設定内容を指定します。サブ要求の応答ペイロードの値を特定する JSON path 式に設定されます。

例えば、以下の内容のアクティビティを作成するサブ要求があるとします。

      "vars": [
        {
          "name": "newActivityId",
          "path": "$.data.attributes.id"
        }
      ]

ここでは、newActivityId という名前の変数が作成され、この変数は data セクションの attributes セクションで id フィールド(通常は新規作成されたアクティビティの ID)の値に設定されます。

変数の参照

変数を参照するには、以下の構文を使用します。

${<varName>}

変数は、サブ要求の本文で任意の場所に使用できます。変数値の最も一般的な使用場所は、以下のとおりです。

  • attributes フィールド内
  • uri のパス内
  • クエリパラメータの一部

例えば、アクティビティを作成するサブ要求があり、その後に備考・経緯を作成するサブ要求があるとします。1 つ目のサブ要求は、前述のように、newActivityId 変数を作成します。2 つ目のサブ要求の uri は以下のとおりです。

"uri": "/common/v1/activities/${newActivityId}/notes"

これにより、1 つ目のサブ要求でアクティビティの子として、新しい備考・経緯が作成されます。

前述の例でコードの全体像は、以下のとおりです。

{
  "requests": [
    {
      "method": "post",
      "uri": "/claim/v1/claims/cc:34/activities",
      "body": {
        "data": {
          "attributes": {
              "activityPattern": "contact_insured",
              "subject": "Cloud API activity"
          }
        }
      },
      "vars": [
        {
          "name": "newActivityId",
          "path": "$.data.attributes.id"
        }
      ]
    },    
    {
      "method": "post",
      "uri": "/common/v1/activities/${newActivityId}/notes",
      "body": {
        "data": {
          "attributes": {
            "body": "Cloud API note #1."
          }
        }
      }
    }
  ]
}

サブ要求に対する応答

コンポジット要求の応答には、応答セクションが含まれます。このセクションには、各サブ要求に対してサブ応答が 1 つ含まれます。サブ応答にはそれぞれ 3 つのセクションがあります。

  • body セクションにはデフォルトで、対応エンドポイントで定義されるデフォルト応答データが含まれます。
  • headers セクションには、カスタムヘッダーがある場合、当該ヘッダーが含まれます。
  • status フィールドは、サブ応答のステータスコードを示します。

例えば、以下はコンポジット要求の応答セクションと 1 つ目のサブ応答で、コンポジット要求の 1 つ目のサブ要求はアクティビティを作成しています。

"responses": [
  {
    "body": {
      "data": {
        "attributes": {
          "activityPattern": "contact_insured",
          "activityType": {
            "code": "general",
            "name": "General"
            },
          "assignedByUser": {
            "displayName": "Andy Applegate",
            "id": "demo_sample:1",
            "type": "User",
            "uri": "/admin/v1/users/demo_sample:1"
          },
          ...
        },
        "checksum": "0",
        "links": {
          "assign": {
            "href": "/common/v1/activities/cc:403/assign",
            "methods": [
              "post"
            ]
          },
          ...
        }
      }
    },
    "headers": {
      "GW-Checksum": "0",
      "Location": "/common/v1/activities/xc:403"
    },
    "status": 201
  },

データのコミットの際に値を生成するフィールド

各サブ要求のサブ応答はそれぞれ、技術的にコミットされていないデータを指定しています。ただし、データがコミットされるまで生成されない値が、一部のフィールドに含まれています。

コミットの一部として生成される値がサブ応答に含まれていると、Cloud API では、コミットされるデータをできるだけ一致させようとします。例えば、コンポジット要求は ID 値を予約することで、これらの ID をサブ応答で提示してデータベースにコミットできるようにします。

ただし、Cloud API で値の一致を実行できないフィールドがいくつかあります。例えば、createTimeupdateTime の値は、コミット前に決定できません。この種類のフィールドは、サブ要求のサブ応答からは常に省略されます。しかし、サブ選択で取得できます。

サブ応答の詳細の抑制

場合によっては、特定のオブジェクトが複数のサブ要求によって変更されることがあります。これにより、中間サブ応答が不必要に作成され、そのサブ応答によりコンポジット応答のサイズが不必要に増加して、コンポジット応答の解析が困難になる可能性があります。

1 つ以上のサブ要求に対して返される情報の量を抑制することで、コンポジット応答を簡素化できます。これを行うには、該当する各サブ要求で以下を含めます。

"includeResponse": false

例:

{
  "requests": [   
    {
      "method": "post",
      "uri": "/common/v1/activities/xc:202/notes",
      "body": {
        "data": {
          "attributes": {
            "body": "Cloud API note #1."
          }
        }
      },
      "includeResponse": false
    },
    ...    

コンポジット応答には、サブ要求のサブ応答が含まれます。ただし、サブ応答はエンドポイントのデフォルト応答を提示するのではなく、以下のようになります。

{
    "responseIncluded": false
},

responseIncluded フィールドのデフォルトは true です。特定のサブ要求に対して詳細な応答が必要な場合は、単純に responseIncluded の参照を省略します。

サブ要求でのクエリパラメータの使用

POST または PATCH のサブ要求では、返されるフィールドをカスタマイズすることもできます。これを行うには、fields クエリパラメータを使用します。構文は以下のとおりです。

{
  "requests": [
    {
      "method": "<post/patch>",
      "uri": "<path>",
      "body": {
        "data": {
          "attributes": {
            "<field1>": "<value1>",
            "<field2>": "<value2>",
            ...
            }
        }
      },
      "parameters" : {
        "fields" : "<value>"
      }
    }, 
    ...
  ]
}

例えば、以下のコードスニペットはアクティビティを作成します。サブ応答では、アクティビティの ID とアサインユーザーのみが含まれるように指定します。

{
  "requests": [
    {
      "method": "post",
      "uri": "/claim/v1/claims/cc:34/activities",
      "body": {
        "data": {
          "attributes": {
              "activityPattern": "contact_insured",
              "subject": "Cloud API activity"
          }
        }
      },
      "parameters" : {
        "fields" : "id,assignedUser"
      }
    },
  ...  

特定の API に対して、コンポジット要求で使用できるすべてのクエリパラメータを網羅したリストは、GET /openapi.json の呼び出しを実行することで表示できます。クエリパラメータでコンポジット要求を使用できる場合、OpenAPI の出力に含まれる行は、「"x-gw-allowForCompositeApi": true」です。

selections セクション

selections セクションには、データのクエリを行うサブ選択が含まれます。これらは requests セクションのサブ選択の後、すべてのサブ要求がデータのコミットに成功した場合にのみ実行されます。

selections セクションの基本的な構文は以下のとおりです。selections セクションで有効なメソッドは GET のみなので、各サブ選択のメソッドを指定する必要はありません。

  "selections": [
    {
      "uri": "<pathForFirstSubselection>"
    },
    {
      "uri": "<pathForSecondSubselection>"
    },
    ....
  ]

例えば、以下のコードはアクティビティとそのアクティビティの備考・経緯を新規作成します。次に、新規作成されたアクティビティのクエリを行います。

{
  "requests": [
    {
      "method": "post",
      "uri": "/claim/v1/claims/cc:34/activities",
      "body": {
        "data": {
          "attributes": {
              "activityPattern": "contact_insured",
              "subject": "Cloud API activity"
          }
        }
      },
      "vars": [
        {
          "name": "newActivityId",
          "path": "$.data.attributes.id"
        }
      ]
    },    
    {
      "method": "post",
      "uri": "/common/v1/activities/${newActivityId}/notes",
      "body": {
        "data": {
          "attributes": {
            "body": "Cloud API note #1."
          }
        }
      }
    }
  ],
  "selections": [
    {
      "uri": "/common/v1/activities/${newActivityId}"
    }
  ]
}

すべてのコンポジット要求機能を含む完全な構文については、コンポジット要求の完全な構文 を参照してください。

selections セクションでのクエリパラメータの使用

各サブ選択には、特定のクエリパラメータを使用できます。これには、以下が含まれます。

  • fields
  • filter
  • includeTotal
  • pageOffset
  • pageSize
  • sort

各サブ選択は互いに独立しています。各サブ選択に対して異なるクエリパラメータを使用でき、クエリパラメータを含むサブ選択と、含まないサブ選択を用意できます。

サブ選択にクエリパラメータを追加する構文は以下のとおりです。

  "selections": [
    {
      "uri": "<pathForFirstQuery>",
      "parameters" : {
        "fields" : "<value>",
        "filter" : [<value>],
        "includeTotal" : <value>,
        "pageOffset" : <value>,
        "pageSize" : <value>,
        "sort" : [<value>]
      }
    },
    ....
  ]

次の点に注目します。

  • fields は、1 つ以上のフィールドの単一文字列をカンマで区切って指定します。文字列全体は引用符で囲みます。
    • 例:"assignedUser,dueDate,priority,subject"
  • filtersort は、文字列化された配列であり、1 つ以上の式で構成されます。個々の式はそれぞれ引用符で囲みます。その上で、式のリストを [ と ] で囲みます。
    • 例: ["dueDate:gt:2022-12-20","status:in:open,complete"]
  • includeTotalpageOffset、および pageSize はブール値または整数値のいずれかなので、引用符は使用しません。

例えば、アクティビティのクエリを行う際、アサインされたユーザー、期日、優先度、および件名のフィールドのみを返す場合は、以下のようになります。

    {
      "uri": "/common/v1/activities",
      "parameters" : {
        "fields" : "assignedUser,dueDate,priority,subject"
      }

期日が 2022 年 12 月 20 日以降のオープンなアクティビティと完了したアクティビティのみを返す場合は、以下のようになります。

    {
      "uri": "/common/v1/activities",
      "parameters" : {
        "filter" : ["dueDate:gt:2022-12-20","status:in:open,complete"]      }

複数の条件に基づいてアクティビティを返す場合は、以下のようになります。

    {
      "uri": "/common/v1/activities",
      "parameters" : {
        "fields" : "assignedUser,dueDate,priority,subject",
        "filter" : ["dueDate:gt:2022-12-20","status:in:open,complete"],
        "includeTotal" : true,
        "pageSize" : 5,
        "sort" : ["dueDate"]
      }

特定の API に対して、コンポジット要求で使用できるすべてのクエリパラメータを網羅したリストは、GET /openapi.json の呼び出しを実行することで表示できます。クエリパラメータでコンポジット要求を使用できる場合、OpenAPI の出力に含まれる行は、「"x-gw-allowForCompositeApi": true」です。

クエリのみを実行するコンポジット要求

データの作成や変更を行わずにデータのクエリのみを行うコンポジット要求を作成できます。これを実行するには、selections セクションのみを含んで requests セクションを含まないコンポジット要求を作成します。この場合、selections セクションの GET は常に実行されます。

selections サブ要求に対する応答

コンポジット要求に selections セクションが含まれる場合、応答にも selections セクションが含まれます。このセクションの構造は、responses セクションと同じです。各サブ選択に対してサブ応答が 1 つ含まれます。サブ応答にはそれぞれ 3 つのセクションがあります。

  • body セクションにはデフォルトで、対応エンドポイントで定義されるデフォルト応答データが含まれます。
  • headers セクションには、カスタムヘッダーがある場合、当該ヘッダーが含まれます。
  • status フィールドは、サブ応答のステータスコードを示します。

コンポジット要求の制限事項

コンポジット要求には、以下の一般的な制限事項があります。

  • 単一のコンポジット要求内のサブ要求とサブ選択の数は、MaximumAllowedNumberOfCompositeSubRequests コンフィギュレーションパラメータの値以下である必要があります(ベースコンフィギュレーションでは、これは 100 に設定されています)。
  • サブ要求では、Cloud API の一部である他のエンドポイントを利用できます。ただし、保険会社が作成したカスタムエンドポイントなど、Cloud API の外部のエンドポイントは利用できません。
  • コンポジット要求では要求包含を使用できません。
    • 要求包含の詳細については、要求包含を参照してください。
  • application/json 以外のコンテンツタイプを使用するサブ要求を含めることはできません。
    • 例えば、ドキュメントでは multipart/form-data を使用するので、コンポジット要求ではドキュメントリソースを処理できません。
  • セットになっているものを反復するメカニズムはありません。
    • 例えば、要素のリストで開始して、そのリストに各項目の関連リソースを含めることはできません。

コンポジット要求を使用する必要があるビジネス要件がいくつかある可能性があります。例えば、未検証の保険契約を使用して新しいクレームを作成する際には、コンポジット要求で保険契約とクレームを作成する必要があります。

コンポジット要求を使用できない、特定のビジネス要件もあります。例:

  • 単一のコンポジット要求を複数のクレームで操作することはできません。
  • 見積のみ、見積とサービス、またはサービスのみのサービス要求では、単一のコンポジット要求でサービス要求を作成および送信できます。ただし、これらの種類のサービス要求は、同じコンポジット要求のライフサイクルの別のステージ(業者または保険会社の要求での、進行中、却下済み、キャンセル済みなど)に進むことはできません。
  • コンポジット要求では、作成または変更できる金融オブジェクトのみが、最終的な非反復的保険金支払セットになります。それ以外の場合は、金融オブジェクトを作成または変更します。これには、支払備金セットと支払備金トランザクション、反復的保険金支払セットと支払トランザクション、およびチェックライフサイクルエンドポイント(POST /mark-issued など)が含まれます。ただし、コンポジット要求内では、保険金支払オブジェクトに関する情報の GET ができます。

前述のリストの例の多くは、中間データのコミットである必要がある状況に関連していますが、設計上、コンポジット要求ではこうした状況を許可していません。ただし、前述のリストは網羅的なものを意図して作成されてはいません。コンポジット要求に関する要件または制限事項の詳細については、ドキュメントの各ビジネス要件について説明するセクションを参照してください。