フィールドレスポンスの削除
GraphQLスキーマに@removeディレクティブを追加し、フィールドの出力をレスポンスから削除します。
説明
GraphQL仕様では、GraphQLのレスポンスはクエリの形状と完全に一致する必要があると定めています。しかし、特定の状況においては、以下の理由からフィールドのレスポンスを返さない方が望ましい場合があります。
- すでにその値を把握しており、再送信しないことでパフォーマンスを向上できる
- ログイン認証情報などの機密情報が含まれている
- 空のフィールドを
null値と区別できる
フィールドに@removeを追加すると、そのフィールドはレスポンスに出力されません。
以下のクエリ(PHP Functions via Schema拡張とHTTP Client拡張を使用)では、サイトドメインとREST APIエンドポイントを連結してHTTPリクエスト送信先のURLを生成しています。これらの「コンポーネント」の値はレスポンスに含める必要がないため、@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
}
)
}...結果(siteURLおよびrequestURLフィールドがレスポンスに含まれていないことに注目してください):
{
"data": {
"_sendJSONObjectItemHTTPRequest": {
"id": 11,
"date": "2020-12-12T04:07:36",
"content": {
"rendered": "<p>Btw, I really like this stuff<\/p>\n"
}
}
}
}また、@removeディレクティブに対して、条件が満たされた場合にのみ値を削除するよう指定することもできます。condition引数には3つの値を指定できます。
ALWAYS(デフォルト値): 常に削除するIS_NULL: 値がnullのときに削除するIS_EMPTY: 値が空のときに削除する
たとえば、以下のクエリでは、投稿にアイキャッチ画像がない場合、featuredImageフィールドの値はnullになります。@remove(condition: IS_NULL)を追加することで、この値はレスポンスに追加されません。
query {
posts {
title
featuredImage @remove(condition: IS_NULL) {
src
}
}
}...結果:
{
"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"
}
]
}
}使用例
外部APIから不要なデータを削除する
外部のREST APIエンドポイントから特定のデータを取得し、それ以外のデータは不要な場合を考えます。@removeを使用してレスポンスのペイロードを小さくし、パフォーマンスを向上させることができます。
_sendJSONObjectItemHTTPRequestフィールド(HTTP Client拡張)を使ってREST APIに接続する- Field to InputとPHP Function via Schemaの
_objectPropertyフィールドを使用して、必要な情報を抽出する @removeでRESTエンドポイントから取得した元のデータを削除する
以下のクエリがすべてをまとめています。
{
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
}) @remove
renderedTitle: _objectProperty(
object: $__postData,
by: {
path: "title.rendered"
}
)
}このクエリへのレスポンスでは、postDataフィールドが削除されています。
{
"data": {
"renderedTitle": "Hello world!"
}
}ユーザー認証情報の出力を防ぐ
この例では、GitHub APIに接続してプライベートリポジトリで利用可能なアーティファクトを取得し、ユーザーの認証情報がレスポンスに出力されないようにしています。
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仕様
この機能は現在GraphQL仕様の一部ではありませんが、要望が提出されています。