Nutzdatenstruktur für eine Antwort mit eingeschlossenen Ressourcen

Einige Endpunkte unterstützen die Möglichkeit, nach einem bestimmten Ressourcentyp und nach mit diesem Typ verbundenen Ressourcentypen zu suchen. Beispielsweise gibt der Endpunkt GET /activities standardmäßig nur Aktivitätsressourcen zurück. Sie können jedoch den include-Abfrageparameter verwenden, um Notizen, die mit den zurückgegebenen Aktivitäten verbunden sind, in die Antwort-Nutzdaten einzubeziehen. Diese Arten von Ressourcen werden als eingeschlossene Ressourcen bezeichnet. Die Technik des Hinzufügens von eingeschlossenen Ressourcen zu einem GET wird manchmal als Response-Einschluss oder Read-Einschluss bezeichnet.

Die Syntax für das Hinzufügen eingeschlossener Ressourcen lautet:

?include=<resourceName>

Beispiel: GET /activities?include=notes gibt alle dem aktuellen Benutzer zugewiesenen Aktivitäten und alle mit diesen Aktivitäten verknüpften Notizen zurück.

Sie können mehrere Ressourcentypen in einer einzigen Abfrage einschließen. Geben Sie dazu die Ressourcen in einer durch Kommas getrennten Liste an. Beispiel: GET /claims?include=exposures,activities gibt alle Schadenfälle zurück, die dem aktuellen Benutzer zugewiesen sind, sowie alle Teilschäden und Aktivitäten, die mit diesen Schadenfällen verknüpft sind.

Wenn Sie einen Aufruf mit include ausführen, enthalten die Antwort-Nutzdaten Informationen über die primären Ressourcen und die eingeschlossenen Ressourcen. Die meisten Informationen über die eingeschlossenen Ressourcen erscheinen jedoch nicht inline mit den primären Ressourcen. Vielmehr:

  • Jede primäre Ressource hat einen related-Abschnitt. In diesem Abschnitt werden die IDs (und Typen) der eingeschlossenen Ressourcen aufgeführt, die mit dieser Ressource verbunden sind. Jeder related-Abschnitt enthält jedoch keine weiteren Details zu diesen Ressourcen.
  • Details zu den eingeschlossenen Ressourcen werden am Ende der Nutzdaten in einem Abschnitt mit der Bezeichnung included angezeigt.

Die IDs der eingeschlossenen Objekte werden sowohl im related- als auch im included-Abschnitt angezeigt. Sie können diese IDs verwenden, um eine primäre Ressource mit Details zu den eingeschlossenen Ressourcen abzugleichen.

Unterschiede zwischen eingeschlossenen Ressourcen und Inline-Ressourcen

Antwort-Nutzdaten können zwei Arten von Ressourcen enthalten, die eine Beziehung zu den Stammressourcen haben: Inline-Ressourcen und eingeschlossene Ressourcen. In der folgenden Tabelle sind die Unterschiede der beiden Ressourcentypen zusammengefasst.

Ressourcentyp Wie viele zugehörige Ressourcen für jede primäre Ressource? Wo erscheinen ihre Felder? Wann erscheinen sie?
Inline-Ressource In der Regel eine. (Beispielsweise hat jede Aktivität nur einen zugehörigen assignedUser.) Gänzlich im attributes-Abschnitt der Stammressource Wenn die Abfrage nicht den Abfrageparameter fields verwendet, werden alle Inline-Ressourcen nur angezeigt, wenn es sich um eines der Standardattribute handelt.

Wenn für die Abfrage der Abfrageparameter fields verwendet wird, wird jede Inline-Ressource angezeigt oder nicht, je nachdem, ob sie in diesem Abfrageparameter angegeben ist.

Eingeschlossene Ressource Eine zu vielen. (Beispielsweise kann jede activity mehrere zugehörige notes enthalten.) IDs werden im related-Abschnitt der Stammressource angezeigt. Die verbleibenden Attribute erscheinen im included-Abschnitt am unteren Ende der Nutzdaten.

Wenn der Abfrageparameter den Abfrageparameter ?include=resourceName enthält

Lernprogramm: Eine Postman-Anfrage mit eingeschlossenen Ressourcen senden

In diesem Lernprogramm wird davon ausgegangen, dass Sie Postman in Ihrer Umgebung mit dem korrekten Beispieldatensatz eingerichtet haben. Weitere Informationen finden Sie unter Lernprogramm: Einrichten Ihrer Postman-Umgebung.

Schritte des Lernprogramms

  1. Starten Sie in Postman eine neue Anforderung, indem Sie auf das + rechts neben der Registerkarte Launchpad klicken.
  2. Geben Sie als Basic Auth-Autorisierung den Benutzer aapplegate und das Kennwort gw an.
  3. Um Antwort-Nutzdaten für den Schadenfall 235-53-365870 (öffentliche ID demo_sample:1) und ihre Kontakte abzurufen, geben Sie Folgendes ein und klicken Sie auf Senden:

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

    In Antwort-Nutzdaten:

    • Im Datenbereich identifiziert Zeile 254 einen zugehörigen Kontakt mit der ID cc:2
    • Im zugehörigen Abschnitt enthalten die Zeilen 410 bis 449 die Details zum Kontakt cc:2. (Die ID befindet sich im zugehörigen Abschnitt in Zeile 424.)
  4. Um Antwort-Nutzdaten für den Schadenfall 235-53-365870 (öffentliche ID demo_sample:1) und seinen Hauptkontakt abzurufen, geben Sie Folgendes ein und klicken Sie auf Senden:

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

    In Antwort-Nutzdaten:

    • Im Datenbereich identifiziert Zeile 250 einen zugehörigen Kontakt mit der ID cc:1
    • Im zugehörigen Abschnitt enthalten die Zeilen 260 bis 372 die Details zum Kontakt cc:1. (Die ID befindet sich im zugehörigen Abschnitt in Zeile 274.)

Struktur einer Antwort mit eingeschlossenen Ressourcen

Die allgemeine Struktur einer Antwort mit eingeschlossenen Ressourcen wird im Folgenden gezeigt. Informationen, die sich speziell auf eingeschlossene Ressourcen beziehen, werden fett dargestellt. (Hinweis: JSON unterstützt keine Kommentare. Zur Klarstellung des Codes wurden jedoch Pseudo-Kommentare hinzugefügt. Jedem Pseudo-Kommentar ist ein Hashtag (#) vorangestellt.)

{
    "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
    ] }
}

Abschnitt "related" (für eine Ressource)

Für jede Ressource gibt es einen Abschnitt related, der Folgendes identifiziert:

  • Anzahl der eingeschlossenen Ressourcen und
  • Die IDs der eingeschlossenen Ressourcen

Das folgende Codefragment stammt beispielsweise aus der Antwort für eine Abfrage aller Aktivitäten und zugehörigen Notizen. Die Aktivität xc:44 enthält eine Notiz mit der ID xc:55.

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

Wenn ein GET den Abfrageparameter included verwendet, aber keine zugehörigen Ressourcen vorhanden sind, wird der Abschnitt related weiterhin angezeigt. Der Zähler ist jedoch 0 und der Datenabschnitt ist leer. Zum Beispiel:

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

Wenn ein GET den Abfrageparameter included auslässt, wird der zugehörige Abschnitt aus den Antwort-Nutzdaten ausgelassen.

Abschnitt "included" (für eine Antwort)

Für jede Antwort gibt es einen Abschnitt included, der am Ende der Antwort-Nutzdaten erscheint. Dieser listet Details zu jeder eingeschlossenen Ressource für die primären Ressourcen auf.

Das folgende Codefragment stammt beispielsweise aus dem Abschnitt included des vorherigen Beispiels.

"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"
                    ]
                }
            }
        }
    ]
},

Denken Sie daran, dass die Aktivität xc:44 eine Notiz enthält. Die ID der enthaltenen Notiz lautet xc:55. Die im Abschnitt included angezeigte Notiz ist die Notiz, die sich auf die Aktivität xc:44 bezieht.

Einschließen einer Sammlung oder einer bestimmten Ressource

Für einen bestimmten Endpunkt geben einige der Optionen includeeine Sammlung von Ressourcen für jede primäre Ressource zurück. Andere Optionen include geben für jede primäre Ressource eine einzelne Ressource zurück.

Ein Beispiel für den ersten Fall ist GET /claims/{claimId}?include=contacts. Dieser Aufruf gibt den Schadenfall mit der angegebenen Schadenfall-ID und allen mit diesem Schadenfall verbundenen ClaimContacts zurück. Theoretisch gibt es mehrere zugehörige Ressourcen (ClaimContacts) für jede primäre Ressource (den Schadenfall mit der angegebenen Schadenfall-ID).

Ein Beispiel für den zweiten Fall ist GET /claims/{claimId}?include=mainContact. Dieser Aufruf gibt den Schadenfall mit der angegebenen Schadenfall-ID und dem ClaimContact zurück, der als Hauptkontakt festgelegt ist. Für jede primäre Ressource (den Schadenfall mit der angegebenen Schadenfall-ID) gibt es nur eine einzige zugehörige Ressource (den ClaimContact-Hauptkontakt).

Sie können auch mehrere Optionen "include" angeben, z. B. GET /claims/{claimId}?include=contacts,mainContact. In diesem Fall legt der zugehörige Abschnitt für jeden Schadenfall die ID aller zugehörigen Kontakte fest und identifiziert auch explizit die ID des Hauptkontakts.

Wenn eine Option "include" mit einem Plural benannt wird, gibt sie in der Regel für jede primäre Ressource einen Satz von Ressourcen zurück. Wenn eine Option "include" mit einem Singular benannt wird, gibt sie eine einzelne Ressource für jede primäre Ressource zurück.

Ermitteln, welche Ressourcen einbezogen werden können

Für jeden Endpunkt können Sie die Ressourcen bestimmen, die einbezogen werden können, indem Sie auf das Swagger-UI-Modell für den Endpunkt verweisen. Im Modell befindet sich ein Daten-Envelope, dessen Name mit ...Inclusions endet. Dieser Daten-Envelope listet alle Ressourcen auf, die bei der Abfrage dieses Ressourcentyps einbezogen werden können.

In der gemeinsamen API verweist das Modell für GET /activities beispielsweise auf ein Element ActivityResponseInclusions. Dieses Element hat ein einzelnes untergeordnetes Element - Note. Das bedeutet, dass der einzige Elementtyp, den Sie in eine Aktivitätsabfrage einschließen können, Notizen sind.

Wenn Sie versuchen, einen Ressourcentyp einzuschließen, den ein bestimmter Endpunkt nicht für die Einschließung unterstützt, gibt die API einen Fehlercode 400 und eine Meldung zurück. Der Versuch GET /activities?include=users ergibt beispielsweise die folgende Meldung:

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