Query Functions
Query FunctionsEntfernung von Feld-Antworten

Entfernung von Feld-Antworten

Included in the “Power Extensions” bundle

HinzufĂĽgen der @remove-Direktive zum GraphQL-Schema, die die Ausgabe eines Feldes aus der Antwort entfernt.

Beschreibung

Die GraphQL-Spezifikation gibt an, dass die GraphQL-Antwort genau der Form der query entsprechen muss. In bestimmten Situationen möchten wir jedoch vermeiden, die Antwort eines Feldes zurückzuschicken, weil:

  • Wir sie bereits kennen und durch das Weglassen die Performance steigern können
  • Sie sensible Informationen enthält (wie z. B. Anmeldedaten)
  • Ein leeres Feld von einem null-Wert unterschieden werden kann

Indem du @remove zu einem Feld hinzufĂĽgst, wird es nicht in der Antwort ausgegeben.

In der folgenden query (die die Erweiterungen PHP Functions via Schema und HTTP Client verwendet) generieren wir die URL, an die eine HTTP-Anfrage gesendet werden soll, indem wir die Site-Domain und den REST-API-Endpunkt zusammensetzen. Da die Werte dieser „Komponenten" für uns nicht relevant sind, müssen sie nicht in der Antwort erscheinen, und wir können sie mit @remove entfernen:

query {
  siteURL: optionValue(name: "siteurl")
    @remove
 
  requestURL: _sprintf(
    string: "%s/wp-json/wp/v2/comments/11/?_fields=id,content,date",
    values: [$__siteURL]
  )
    @remove
 
  _sendJSONObjectItemHTTPRequest(
    input: {
      url: $__requestURL
    }
  )
}

...was folgendes erzeugt (beachte, dass die Felder siteURL und requestURL nicht in der Antwort enthalten sind):

{
  "data": {
    "_sendJSONObjectItemHTTPRequest": {
      "id": 11,
      "date": "2020-12-12T04:07:36",
      "content": {
        "rendered": "<p>Btw, I really like this stuff<\/p>\n"
      }
    }
  }
}

Wir können der Direktive @remove auch mitteilen, den Wert nur unter einer bestimmten Bedingung zu entfernen. Das Argument condition kann 3 mögliche Werte annehmen:

  • ALWAYS (Standardwert): Immer entfernen
  • IS_NULL: Entfernen, wenn der Wert null ist
  • IS_EMPTY: Entfernen, wenn der Wert leer ist

In der folgenden query hat das Feld featuredImage den Wert null, wenn ein Beitrag kein Beitragsbild hat. Durch HinzufĂĽgen von @remove(condition: IS_NULL) wird dieser Wert nicht zur Antwort hinzugefĂĽgt:

query {
  posts {
    title
    featuredImage @remove(condition: IS_NULL) {
      src
    }
  }
}

...was folgendes erzeugt:

{
  "data": {
    "posts": [
      {
        "title": "Hello world!"
      },
      {
        "title": "Nested mutations are a must have",
        "featuredImage": {
          "src": "https:\/\/gato-graphql.lndo.site\/wp-content\/uploads\/2022\/05\/graphql-voyager-public.jpg"
        }
      },
      {
        "title": "Customize the schema for each client"
      }
    ]
  }
}

Beispiele

Nicht benötigte Daten aus einer externen API entfernen

Angenommen, wir möchten bestimmte Daten von einem externen REST-API-Endpunkt abrufen und benötigen die restlichen Daten nicht. Wir können dann @remove verwenden, um die Antwort-Payload zu verkleinern und damit die Performance zu steigern:

  • Das Feld _sendJSONObjectItemHTTPRequest (aus der Erweiterung HTTP Client) verwenden, um eine Verbindung zur REST-API herzustellen
  • Diese Daten verarbeiten, um die benötigte Information zu extrahieren (ĂĽber Field to Input und das Feld _objectProperty aus PHP Function via Schema)
  • Die ursprĂĽnglichen Daten vom REST-Endpunkt mit @remove entfernen

Diese query bringt alles zusammen:

{
  postData: _sendJSONObjectItemHTTPRequest(input: {
    url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
  }) @remove
  renderedTitle: _objectProperty(
    object: $__postData,
    by: {
      path: "title.rendered"
    }
  )
}

In der Antwort auf diese query wurde das Feld postData entfernt:

{
  "data": {
    "renderedTitle": "Hello world!"
  }
}

Benutzer-Anmeldedaten nicht ausgeben

Dieses Beispiel stellt eine Verbindung zur GitHub-API her, um die in einem privaten Repository verfĂĽgbaren Artefakte abzurufen, und verhindert dabei die Ausgabe der Benutzer-Anmeldedaten in der Antwort:

query RetrieveGitHubActionArtifacts(
  $repoOwner: String!
  $repoProject: String!
) {
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
    @remove
 
  # Create the authorization header to send to GitHub
  authorizationHeader: _sprintf(
    string: "Bearer %s"
    # "Field to Input" feature to access value from the field above
    values: [$__githubAccessToken]
  )
    @remove
 
  # Create the authorization header to send to GitHub
  githubRequestHeaders: _echo(
    value: [
      { name: "Accept", value: "application/vnd.github+json" }
      { name: "Authorization", value: $__authorizationHeader }
    ]
  )
    @remove
 
  githubAPIEndpoint: _sprintf(
    string: "https://api.github.com/repos/%s/%s/actions/artifacts"
    values: [$repoOwner, $repoProject]
  )
 
  # Use the field from "Send HTTP Request Fields" to connect to GitHub
  gitHubArtifactData: _sendJSONObjectItemHTTPRequest(
    input: {
      url: $__githubAPIEndpoint
      options: { headers: $__githubRequestHeaders }
    }
  )
}

GraphQL-Spezifikation

Diese Funktionalität ist derzeit nicht Teil der GraphQL-Spezifikation, wurde jedoch angefragt: