Query Functions
Query FunctionsPenghapusan Respons Field

Penghapusan Respons Field

Included in the “Power Extensions” bundle

Penambahan direktif @remove ke skema GraphQL, yang menghapus output dari sebuah field dalam respons.

Deskripsi

Spesifikasi GraphQL menyatakan bahwa respons GraphQL harus sesuai persis dengan bentuk query. Namun, dalam situasi tertentu kita lebih memilih untuk tidak mengirimkan kembali respons dari field tersebut, karena:

  • Kita sudah mengetahui nilainya, dan dengan tidak mengirimkannya kembali kita dapat meningkatkan performa
  • Field tersebut mengandung informasi sensitif (seperti kredensial login)
  • Field yang kosong dapat dibedakan dari nilai null

Dengan menambahkan @remove pada field, field tersebut tidak akan ditampilkan dalam respons.

Pada query di bawah (yang menggunakan ekstensi PHP Functions via Schema dan HTTP Client), kita membuat URL untuk mengirim permintaan HTTP, dengan menggabungkan domain situs dan endpoint REST API. Karena nilai-nilai "komponen" ini tidak menjadi perhatian kita, tidak perlu menampilkannya dalam respons, dan kita dapat menggunakan @remove untuk menghapusnya:

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

...menghasilkan (perhatikan bahwa field siteURL dan requestURL tidak ada dalam respons):

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

Kita juga dapat memberi tahu direktif @remove untuk menghapus nilai secara kondisional, jika suatu kondisi terpenuhi. Argumen condition dapat menerima 3 nilai yang mungkin:

  • ALWAYS (nilai default): Hapus selalu
  • IS_NULL: Hapus setiap kali nilainya null
  • IS_EMPTY: Hapus setiap kali nilainya kosong

Misalnya, dalam query di bawah, ketika sebuah post tidak memiliki gambar unggulan, field featuredImage akan memiliki nilai null. Dengan menambahkan @remove(condition: IS_NULL), nilai ini tidak akan ditambahkan ke respons:

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

...menghasilkan:

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

Contoh

Menghapus data yang tidak diperlukan dari API eksternal

Misalkan kita ingin mengambil beberapa data spesifik dari endpoint REST API eksternal, dan kita tidak membutuhkan sisa data lainnya. Kita kemudian dapat menggunakan @remove untuk memperkecil payload respons, sehingga meningkatkan performa:

  • Gunakan field _sendJSONObjectItemHTTPRequest (dari ekstensi HTTP Client) untuk terhubung ke REST API
  • Proses data ini untuk mengekstrak informasi yang diperlukan (melalui Field to Input dan field _objectProperty dari PHP Function via Schema)
  • @remove data asli dari endpoint REST

Query ini menggabungkan semuanya:

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

Dalam respons query ini, field postData telah dihapus:

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

Menghindari pencetakan kredensial pengguna

Contoh ini terhubung ke API GitHub untuk mengambil artefak yang tersedia dalam repositori privat, dan menghindari pencetakan kredensial pengguna dalam respons:

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

Spesifikasi GraphQL

Fungsionalitas ini saat ini belum menjadi bagian dari spesifikasi GraphQL, tetapi telah diminta: