Entfernung von Feld-Antworten
HinzufĂĽgen der @remove-Direktive zum GraphQL-Schema, die die Ausgabe eines Feldes aus der Antwort entfernt.
Beschreibung
Die GraphQL-Spezifikation gibt an, dass die GraphQL-Antwort genau der Form der query entsprechen muss. In bestimmten Situationen möchten wir jedoch vermeiden, die Antwort eines Feldes zurückzuschicken, weil:
- Wir sie bereits kennen und durch das Weglassen die Performance steigern können
- Sie sensible Informationen enthält (wie z. B. Anmeldedaten)
- Ein leeres Feld von einem
null-Wert unterschieden werden kann
Indem du @remove zu einem Feld hinzufĂĽgst, wird es nicht in der Antwort ausgegeben.
In der folgenden query (die die Erweiterungen PHP Functions via Schema und HTTP Client verwendet) generieren wir die URL, an die eine HTTP-Anfrage gesendet werden soll, indem wir die Site-Domain und den REST-API-Endpunkt zusammensetzen. Da die Werte dieser „Komponenten" für uns nicht relevant sind, müssen sie nicht in der Antwort erscheinen, und wir können sie mit @remove entfernen:
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
}
)
}...was folgendes erzeugt (beachte, dass die Felder siteURL und requestURL nicht in der Antwort enthalten sind):
{
"data": {
"_sendJSONObjectItemHTTPRequest": {
"id": 11,
"date": "2020-12-12T04:07:36",
"content": {
"rendered": "<p>Btw, I really like this stuff<\/p>\n"
}
}
}
}Wir können der Direktive @remove auch mitteilen, den Wert nur unter einer bestimmten Bedingung zu entfernen. Das Argument condition kann 3 mögliche Werte annehmen:
ALWAYS(Standardwert): Immer entfernenIS_NULL: Entfernen, wenn der WertnullistIS_EMPTY: Entfernen, wenn der Wert leer ist
In der folgenden query hat das Feld featuredImage den Wert null, wenn ein Beitrag kein Beitragsbild hat. Durch HinzufĂĽgen von @remove(condition: IS_NULL) wird dieser Wert nicht zur Antwort hinzugefĂĽgt:
query {
posts {
title
featuredImage @remove(condition: IS_NULL) {
src
}
}
}...was folgendes erzeugt:
{
"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"
}
]
}
}Beispiele
Nicht benötigte Daten aus einer externen API entfernen
Angenommen, wir möchten bestimmte Daten von einem externen REST-API-Endpunkt abrufen und benötigen die restlichen Daten nicht. Wir können dann @remove verwenden, um die Antwort-Payload zu verkleinern und damit die Performance zu steigern:
- Das Feld
_sendJSONObjectItemHTTPRequest(aus der Erweiterung HTTP Client) verwenden, um eine Verbindung zur REST-API herzustellen - Diese Daten verarbeiten, um die benötigte Information zu extrahieren (über Field to Input und das Feld
_objectPropertyaus PHP Function via Schema) - Die ursprĂĽnglichen Daten vom REST-Endpunkt mit
@removeentfernen
Diese query bringt alles zusammen:
{
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
}) @remove
renderedTitle: _objectProperty(
object: $__postData,
by: {
path: "title.rendered"
}
)
}In der Antwort auf diese query wurde das Feld postData entfernt:
{
"data": {
"renderedTitle": "Hello world!"
}
}Benutzer-Anmeldedaten nicht ausgeben
Dieses Beispiel stellt eine Verbindung zur GitHub-API her, um die in einem privaten Repository verfĂĽgbaren Artefakte abzurufen, und verhindert dabei die Ausgabe der Benutzer-Anmeldedaten in der Antwort:
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-Spezifikation
Diese Funktionalität ist derzeit nicht Teil der GraphQL-Spezifikation, wurde jedoch angefragt: