Alan Yanıt Kaldırma
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,
nulldeğ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ırIS_NULL: Değernullolduğunda kaldırIS_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)
_sendJSONObjectItemHTTPRequestalanını kullan - İhtiyaç duyulan bilgiyi ayıklamak için bu verileri işle (Field to Input ve PHP Function via Schema'dan
_objectPropertyalanı aracılığıyla) - REST uç noktasından gelen orijinal verileri
@removeile 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: