Query Functions
Query FunctionsAlan Yanıt Kaldırma

Alan Yanıt Kaldırma

Included in the “Power Extensions” bundle

GraphQL şemasına @remove direktifinin eklenmesi; bu direktif, bir alanın çıktısını yanıttan kaldırır.

Açıklama

GraphQL spesifikasyonu, GraphQL yanıtının query'nin şekliyle tam olarak eşleşmesi gerektiğini belirtir. Ancak bazı durumlarda alanın yanıtını geri göndermemeyi tercih ederiz, çünkü:

  • Değeri zaten biliyoruz ve tekrar göndermeyerek performansı artırabiliriz
  • Hassas bilgiler içeriyor (oturum açma kimlik bilgileri gibi)
  • Boş bir alan, null değerinden ayırt edilebilir

Alana @remove eklendiğinde, bu alan yanıtta yazdırılmaz.

Aşağıdaki query'de (PHP Functions via Schema ve HTTP Client uzantılarını kullanan), site alan adını ve REST API uç noktasını birleştirerek bir HTTP isteği göndermek için URL oluşturuyoruz. Bu "bileşenlerin" değerleri bizim için önemli olmadığından, bunları yanıta dahil etmemize gerek yok ve @remove ile kaldırabiliriz:

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
    }
  )
}

...üretilen çıktı (dikkat edin: siteURL ve requestURL alanları yanıtta yer almıyor):

{
  "data": {
    "_sendJSONObjectItemHTTPRequest": {
      "id": 11,
      "date": "2020-12-12T04:07:36",
      "content": {
        "rendered": "<p>Btw, I really like this stuff<\/p>\n"
      }
    }
  }
}

@remove direktifine, bir koşul sağlandığında değeri koşullu olarak kaldırmasını da söyleyebiliriz. condition argümanı 3 olası değer alabilir:

  • ALWAYS (varsayılan değer): Her zaman kaldır
  • IS_NULL: Değer null olduğunda kaldır
  • IS_EMPTY: Değer boş olduğunda kaldır

Örneğin, aşağıdaki query'de bir gönderi öne çıkan görsel içermediğinde featuredImage alanının değeri null olacaktır. @remove(condition: IS_NULL) ekleyerek bu değer yanıta dahil edilmez:

query {
  posts {
    title
    featuredImage @remove(condition: IS_NULL) {
      src
    }
  }
}

...üretilen çıktı:

{
  "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"
      }
    ]
  }
}

Örnekler

Harici bir API'den gereksiz verileri kaldırma

Diyelim ki harici bir REST API uç noktasından belirli verileri almak istiyoruz ve geri kalan verilere ihtiyacımız yok. Bu durumda yanıt yükünü küçültmek ve performansı artırmak için @remove kullanabiliriz:

  • REST API'ye bağlanmak için (HTTP Client uzantısından) _sendJSONObjectItemHTTPRequest alanını kullan
  • İhtiyaç duyulan bilgiyi ayıklamak için bu verileri işle (Field to Input ve PHP Function via Schema'dan _objectProperty alanı aracılığıyla)
  • REST uç noktasından gelen orijinal verileri @remove ile kaldır

Bu query her şeyi bir araya getirir:

{
  postData: _sendJSONObjectItemHTTPRequest(input: {
    url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
  }) @remove
  renderedTitle: _objectProperty(
    object: $__postData,
    by: {
      path: "title.rendered"
    }
  )
}

Bu query'nin yanıtında postData alanı kaldırılmıştır:

{
  "data": {
    "renderedTitle": "Hello world!"
  }
}

Kullanıcı kimlik bilgilerini yazdırmaktan kaçınma

Bu örnek, özel bir depodaki mevcut artifact'leri almak için GitHub API'sine bağlanır ve kullanıcının kimlik bilgilerinin yanıtta yazdırılmasını önler:

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 spesifikasyonu

Bu işlevsellik şu anda GraphQL spesifikasyonunun bir parçası değildir, ancak talep edilmiştir: