Penghapusan Respons Field
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 selaluIS_NULL: Hapus setiap kali nilainyanullIS_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
_objectPropertydari PHP Function via Schema) @removedata 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: