Query Functions
Query FunctionsSuppression de la Réponse d'un Champ

Suppression de la Réponse d'un Champ

Included in the “Power Extensions” bundle

Ajout de la directive @remove au schéma GraphQL, qui supprime la sortie d'un champ de la réponse.

Description

La spécification GraphQL indique que la réponse GraphQL doit correspondre exactement à la forme de la requête. Cependant, dans certaines circonstances, nous préférons éviter de renvoyer la réponse du champ, car :

  • Nous savons déjà ce que c'est, et en ne le renvoyant pas, nous pouvons améliorer les performances
  • Il contient des informations sensibles (comme des identifiants de connexion)
  • Un champ vide peut être distingué d'une valeur null

En ajoutant @remove au champ, il ne sera pas inclus dans la réponse.

Dans la requête ci-dessous (qui utilise les extensions PHP Functions via Schema et HTTP Client), nous générons l'URL vers laquelle envoyer une requête HTTP, en concaténant le domaine du site et l'endpoint de l'API REST. Comme les valeurs de ces « composants » ne nous intéressent pas, il n'est pas nécessaire de les inclure dans la réponse, et nous pouvons les supprimer avec @remove :

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

...produisant (notez que les champs siteURL et requestURL ne figurent pas dans la réponse) :

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

Nous pouvons également indiquer à la directive @remove de supprimer la valeur de manière conditionnelle, si une condition est remplie. L'argument condition peut recevoir 3 valeurs possibles :

  • ALWAYS (valeur par défaut) : La supprimer toujours
  • IS_NULL : La supprimer lorsque la valeur est null
  • IS_EMPTY : La supprimer lorsque la valeur est vide

Par exemple, dans la requête ci-dessous, lorsqu'un article n'a pas d'image mise en avant, le champ featuredImage aura la valeur null. En ajoutant @remove(condition: IS_NULL), cette valeur ne sera pas ajoutée à la réponse :

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

...produisant :

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

Exemples

Supprimer les données inutiles d'une API externe

Supposons que nous voulions récupérer des données spécifiques d'un endpoint d'API REST externe, et que nous n'ayons pas besoin du reste des données. Nous pouvons alors utiliser @remove pour réduire la taille du payload de la réponse, améliorant ainsi les performances :

  • Utiliser le champ _sendJSONObjectItemHTTPRequest (de l'extension HTTP Client) pour se connecter à l'API REST
  • Traiter ces données pour extraire l'information souhaitée (via Field to Input et le champ _objectProperty de PHP Function via Schema)
  • Supprimer avec @remove les données originales de l'endpoint REST

Cette requête relie tout ensemble :

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

Dans la réponse à cette requête, le champ postData a été supprimé :

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

Éviter d'afficher les identifiants de l'utilisateur

Cet exemple se connecte à l'API GitHub pour récupérer les artefacts disponibles dans un dépôt privé, et évite d'afficher les identifiants de l'utilisateur dans la réponse :

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

Spécification GraphQL

Cette fonctionnalité ne fait pas actuellement partie de la spécification GraphQL, mais elle a été demandée :