Query-functies
Query-functiesVeldrespons Verwijderen

Veldrespons Verwijderen

Included in the “Power Extensions” bundle

Toevoeging van de @remove-directive aan het GraphQL-schema, die de uitvoer van een veld uit de respons verwijdert.

Beschrijving

De GraphQL-specificatie geeft aan dat de GraphQL-respons precies overeen moet komen met de vorm van de query. In bepaalde situaties willen we echter liever de respons van het veld niet terugsturen, omdat:

  • We al weten wat het is, en door het niet opnieuw te sturen de prestaties kunnen verbeteren
  • Het gevoelige informatie bevat (zoals inloggegevens)
  • Een leeg veld onderscheiden kan worden van een null-waarde

Door @remove aan het veld toe te voegen, wordt het niet in de respons opgenomen.

In de onderstaande query (die de extensies PHP Functions via Schema en HTTP Client gebruikt) genereren we de URL om een HTTP-verzoek naartoe te sturen, door het sitedomein en het REST API-eindpunt samen te voegen. Omdat de waarden van deze "componenten" ons niet interesseren, hoeven ze niet in de respons te worden opgenomen, en kunnen we ze met @remove verwijderen:

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
    }
  )
}

...met als resultaat (merk op dat de velden siteURL en requestURL niet in de respons staan):

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

We kunnen de directive @remove ook opdragen om de waarde voorwaardelijk te verwijderen als aan een bepaalde voorwaarde is voldaan. Het argument condition kan 3 mogelijke waarden aannemen:

  • ALWAYS (standaardwaarde): Altijd verwijderen
  • IS_NULL: Verwijderen wanneer de waarde null is
  • IS_EMPTY: Verwijderen wanneer de waarde leeg is

In de onderstaande query, wanneer een bericht geen uitgelichte afbeelding heeft, heeft het veld featuredImage de waarde null. Door @remove(condition: IS_NULL) toe te voegen, wordt deze waarde niet aan de respons toegevoegd:

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

...met als resultaat:

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

Voorbeelden

Onnodige gegevens uit een externe API verwijderen

Stel dat we bepaalde gegevens uit een extern REST API-eindpunt willen ophalen en de rest van de gegevens niet nodig hebben. We kunnen @remove gebruiken om de omvang van de responspayload te verkleinen en zo de prestaties te verbeteren:

  • Gebruik het veld _sendJSONObjectItemHTTPRequest (uit de extensie HTTP Client) om verbinding te maken met de REST API
  • Verwerk deze gegevens om de benodigde informatie eruit te halen (via Field to Input en het veld _objectProperty uit PHP Function via Schema)
  • Verwijder de oorspronkelijke gegevens van het REST-eindpunt met @remove

Deze query brengt alles samen:

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

In de respons op deze query is het veld postData verwijderd:

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

Gebruikersgegevens niet weergeven

Dit voorbeeld maakt verbinding met de GitHub API om de beschikbare artefacten in een privérepository op te halen, en voorkomt dat de inloggegevens van de gebruiker in de respons worden weergegeven:

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-specificatie

Deze functionaliteit maakt momenteel geen deel uit van de GraphQL-specificatie, maar is wel aangevraagd: