Query Functions
Query Functionsフィールドレスポンスの削除

フィールドレスポンスの削除

Included in the “Power Extensions” bundle

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 InputPHP 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仕様の一部ではありませんが、要望が提出されています。