Veldrespons Verwijderen
Toevoeging van de @remove-directive aan het GraphQL-schema, die de uitvoer van een veld uit de respons verwijdert.
Beschrijving
De GraphQL-specificatie geeft aan dat de GraphQL-respons precies overeen moet komen met de vorm van de query. In bepaalde situaties willen we echter liever de respons van het veld niet terugsturen, omdat:
- We al weten wat het is, en door het niet opnieuw te sturen de prestaties kunnen verbeteren
- Het gevoelige informatie bevat (zoals inloggegevens)
- Een leeg veld onderscheiden kan worden van een
null-waarde
Door @remove aan het veld toe te voegen, wordt het niet in de respons opgenomen.
In de onderstaande query (die de extensies PHP Functions via Schema en HTTP Client gebruikt) genereren we de URL om een HTTP-verzoek naartoe te sturen, door het sitedomein en het REST API-eindpunt samen te voegen. Omdat de waarden van deze "componenten" ons niet interesseren, hoeven ze niet in de respons te worden opgenomen, en kunnen we ze met @remove verwijderen:
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
}
)
}...met als resultaat (merk op dat de velden siteURL en requestURL niet in de respons staan):
{
"data": {
"_sendJSONObjectItemHTTPRequest": {
"id": 11,
"date": "2020-12-12T04:07:36",
"content": {
"rendered": "<p>Btw, I really like this stuff<\/p>\n"
}
}
}
}We kunnen de directive @remove ook opdragen om de waarde voorwaardelijk te verwijderen als aan een bepaalde voorwaarde is voldaan. Het argument condition kan 3 mogelijke waarden aannemen:
ALWAYS(standaardwaarde): Altijd verwijderenIS_NULL: Verwijderen wanneer de waardenullisIS_EMPTY: Verwijderen wanneer de waarde leeg is
In de onderstaande query, wanneer een bericht geen uitgelichte afbeelding heeft, heeft het veld featuredImage de waarde null. Door @remove(condition: IS_NULL) toe te voegen, wordt deze waarde niet aan de respons toegevoegd:
query {
posts {
title
featuredImage @remove(condition: IS_NULL) {
src
}
}
}...met als resultaat:
{
"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"
}
]
}
}Voorbeelden
Onnodige gegevens uit een externe API verwijderen
Stel dat we bepaalde gegevens uit een extern REST API-eindpunt willen ophalen en de rest van de gegevens niet nodig hebben. We kunnen @remove gebruiken om de omvang van de responspayload te verkleinen en zo de prestaties te verbeteren:
- Gebruik het veld
_sendJSONObjectItemHTTPRequest(uit de extensie HTTP Client) om verbinding te maken met de REST API - Verwerk deze gegevens om de benodigde informatie eruit te halen (via Field to Input en het veld
_objectPropertyuit PHP Function via Schema) - Verwijder de oorspronkelijke gegevens van het REST-eindpunt met
@remove
Deze query brengt alles samen:
{
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
}) @remove
renderedTitle: _objectProperty(
object: $__postData,
by: {
path: "title.rendered"
}
)
}In de respons op deze query is het veld postData verwijderd:
{
"data": {
"renderedTitle": "Hello world!"
}
}Gebruikersgegevens niet weergeven
Dit voorbeeld maakt verbinding met de GitHub API om de beschikbare artefacten in een privérepository op te halen, en voorkomt dat de inloggegevens van de gebruiker in de respons worden weergegeven:
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-specificatie
Deze functionaliteit maakt momenteel geen deel uit van de GraphQL-specificatie, maar is wel aangevraagd: