Usuwanie Odpowiedzi Pola
Dodanie dyrektywy @remove do schematu GraphQL, która usuwa dane wyjściowe pola z odpowiedzi.
Opis
Specyfikacja GraphQL wskazuje, że odpowiedź GraphQL musi dokładnie odpowiadać kształtowi zapytania. Jednak w pewnych okolicznościach wolimy unikać odsyłania odpowiedzi pola, ponieważ:
- Już znamy tę wartość i nie odsyłając jej ponownie, możemy poprawić wydajność
- Zawiera wrażliwe informacje (takie jak dane logowania)
- Puste pole można odróżnić od wartości
null
Dodając @remove do pola, nie zostanie ono uwzględnione w odpowiedzi.
W poniższym zapytaniu (które używa rozszerzeń PHP Functions via Schema i HTTP Client) generujemy adres URL do wysłania żądania HTTP, łącząc domenę witryny i endpoint API REST. Ponieważ wartości tych „komponentów" nas nie interesują, nie ma potrzeby umieszczania ich w odpowiedzi i możemy je usunąć za pomocą @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
}
)
}...dając w wyniku (zauważ, że pola siteURL i requestURL nie ma w odpowiedzi):
{
"data": {
"_sendJSONObjectItemHTTPRequest": {
"id": 11,
"date": "2020-12-12T04:07:36",
"content": {
"rendered": "<p>Btw, I really like this stuff<\/p>\n"
}
}
}
}Możemy również polecić dyrektywie @remove, aby warunkowo usuwała wartość, gdy spełniony jest określony warunek. Argument condition może przyjmować 3 możliwe wartości:
ALWAYS(wartość domyślna): Usuwa zawszeIS_NULL: Usuwa zawsze, gdy wartość wynosinullIS_EMPTY: Usuwa zawsze, gdy wartość jest pusta
Na przykład w poniższym zapytaniu, gdy post nie ma obrazu wyróżniającego, pole featuredImage będzie miało wartość null. Dodając @remove(condition: IS_NULL), ta wartość nie zostanie dodana do odpowiedzi:
query {
posts {
title
featuredImage @remove(condition: IS_NULL) {
src
}
}
}...dając w wyniku:
{
"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"
}
]
}
}Przykłady
Usuwanie niepotrzebnych danych z zewnętrznego API
Załóżmy, że chcemy pobrać określone dane z zewnętrznego endpointu API REST i nie potrzebujemy pozostałych danych. Możemy wtedy użyć @remove, aby zmniejszyć rozmiar ładunku odpowiedzi, poprawiając tym samym wydajność:
- Użyj pola
_sendJSONObjectItemHTTPRequest(z rozszerzenia HTTP Client) do połączenia z API REST - Przetwórz te dane, aby wyodrębnić potrzebną informację (za pomocą Field to Input i pola
_objectPropertyz PHP Function via Schema) - Usuń za pomocą
@removeoryginalne dane z endpointu REST
To zapytanie łączy wszystko razem:
{
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
}) @remove
renderedTitle: _objectProperty(
object: $__postData,
by: {
path: "title.rendered"
}
)
}W odpowiedzi na to zapytanie pole postData zostało usunięte:
{
"data": {
"renderedTitle": "Hello world!"
}
}Unikanie wyświetlania danych uwierzytelniających użytkownika
Ten przykład łączy się z API GitHub, aby pobrać artefakty dostępne w prywatnym repozytorium, i unika wyświetlania danych uwierzytelniających użytkownika w odpowiedzi:
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 }
}
)
}Specyfikacja GraphQL
Ta funkcjonalność nie jest obecnie częścią specyfikacji GraphQL, ale została zgłoszona jako propozycja: