Suppression de la Réponse d'un Champ
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 toujoursIS_NULL: La supprimer lorsque la valeur estnullIS_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
_objectPropertyde PHP Function via Schema) - Supprimer avec
@removeles 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 :