Query Functions
Query FunctionsRimozione della Risposta di un Campo

Rimozione della Risposta di un Campo

Included in the “Power Extensions” bundle

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 sempre
  • IS_NULL: Rimuoverlo ogni volta che il valore è null
  • IS_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 _objectProperty di PHP Function via Schema)
  • Rimuovere con @remove i 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: