Query Functions
Query FunctionsUsuwanie Odpowiedzi Pola

Usuwanie Odpowiedzi Pola

Included in the “Power Extensions” bundle

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 zawsze
  • IS_NULL: Usuwa zawsze, gdy wartość wynosi null
  • IS_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 _objectProperty z PHP Function via Schema)
  • Usuń za pomocą @remove oryginalne 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: