Rimozione della Risposta di un Campo
Aggiunta della direttiva @remove allo schema GraphQL, che rimuove l'output di un campo dalla risposta.
Descrizione
La specifica GraphQL indica che la risposta GraphQL deve corrispondere esattamente alla forma della query. Tuttavia, in alcune circostanze preferiamo evitare di restituire la risposta del campo, perché:
- Sappiamo già di cosa si tratta e, non rinviandolo, possiamo migliorare le prestazioni
- Contiene informazioni sensibili (come le credenziali di accesso)
- Un campo vuoto può essere distinto da un valore
null
Aggiungendo @remove al campo, esso non verrà incluso nella risposta.
Nella query qui sotto (che utilizza le estensioni PHP Functions via Schema e HTTP Client), generiamo l'URL a cui inviare una richiesta HTTP, concatenando il dominio del sito e l'endpoint dell'API REST. Poiché i valori di questi "componenti" non ci interessano, non è necessario includerli nella risposta e possiamo rimuoverli con @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
}
)
}...producendo (notare che i campi siteURL e requestURL non figurano nella risposta):
{
"data": {
"_sendJSONObjectItemHTTPRequest": {
"id": 11,
"date": "2020-12-12T04:07:36",
"content": {
"rendered": "<p>Btw, I really like this stuff<\/p>\n"
}
}
}
}Possiamo anche indicare alla direttiva @remove di rimuovere il valore in modo condizionale, se una condizione è soddisfatta. L'argomento condition può ricevere 3 valori possibili:
ALWAYS(valore predefinito): Rimuoverlo sempreIS_NULL: Rimuoverlo ogni volta che il valore ènullIS_EMPTY: Rimuoverlo ogni volta che il valore è vuoto
Ad esempio, nella query qui sotto, quando un post non ha un'immagine in evidenza, il campo featuredImage avrà valore null. Aggiungendo @remove(condition: IS_NULL), questo valore non verrà aggiunto alla risposta:
query {
posts {
title
featuredImage @remove(condition: IS_NULL) {
src
}
}
}...producendo:
{
"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"
}
]
}
}Esempi
Rimuovere i dati non necessari da un'API esterna
Supponiamo di voler recuperare alcuni dati specifici da un endpoint di un'API REST esterna e di non aver bisogno del resto dei dati. Possiamo quindi usare @remove per ridurre la dimensione del payload della risposta, migliorando così le prestazioni:
- Usare il campo
_sendJSONObjectItemHTTPRequest(dell'estensione HTTP Client) per connettersi all'API REST - Elaborare questi dati per estrarre l'informazione necessaria (tramite Field to Input e il campo
_objectPropertydi PHP Function via Schema) - Rimuovere con
@removei dati originali dall'endpoint REST
Questa query collega tutto insieme:
{
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
}) @remove
renderedTitle: _objectProperty(
object: $__postData,
by: {
path: "title.rendered"
}
)
}Nella risposta a questa query, il campo postData è stato rimosso:
{
"data": {
"renderedTitle": "Hello world!"
}
}Evitare di mostrare le credenziali dell'utente
Questo esempio si connette all'API di GitHub per recuperare gli artefatti disponibili in un repository privato, ed evita di mostrare le credenziali dell'utente nella risposta:
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 }
}
)
}Specifica GraphQL
Questa funzionalità attualmente non fa parte della specifica GraphQL, ma è stata richiesta: