{"meta":{"title":"GraphQLグローバルノードIDの移行","intro":"2つのグローバルノードIDフォーマットについて、そして旧来のフォーマットから新フォーマットへの移行方法について学びます。","product":"GraphQL API","breadcrumbs":[{"href":"/ja/graphql","title":"GraphQL API"},{"href":"/ja/graphql/guides","title":"ガイド"},{"href":"/ja/graphql/guides/migrating-graphql-global-node-ids","title":"グローバル ノード ID の移行"}],"documentType":"article"},"body":"# GraphQLグローバルノードIDの移行\n\n2つのグローバルノードIDフォーマットについて、そして旧来のフォーマットから新フォーマットへの移行方法について学びます。\n\n## 背景\n\nGitHub GraphQL API では、現在、2 種類のグローバル ノード ID 形式がサポートされています。 レガシ形式は 閉鎖 になり、新しい形式に置き換えられます。 このガイドは、必要な場合の新フォーマットへの移行方法を紹介します。\n\n新しいフォーマットに移行することで、リクエストに対するレスポンスタイムが一貫して小さくなることが保証できます。 また、レガシ ID が 閉鎖 になったら、アプリケーションが引き続き動作することを確認します。\n\n従来のグローバルノードID形式が閉鎖 となる理由についての詳細は、「[GraphQL で提供予定の新しいグローバルID形式](https://github.blog/2021-02-10-new-global-id-format-coming-to-graphql)」をご覧ください。\n\n## 対応の必要性の判断\n\nGraphQLグローバルノードIDへの参照を保存している場合にのみ、移行のステップを踏んでいかなければなりません。 これらの ID は、スキーマ内の任意のオブジェクトの `id` フィールドに対応します。 グローバルノードIDをまったく保存していないなら、変更なしにAPIを扱い続けられます。\n\nさらに、現在、レガシ ID をデコードして型情報を抽出する場合 (たとえば、オブジェクトが pull request であるかどうかを判断するために `PR_kwDOAHz1OX4uYAah` の最初の 2 文字を使用する場合)、ID の形式が変更されたため、サービスは中断されます。 これらのIDを不透明な文字列として扱うよう、サービスを移行しなければなりません。 これらのIDは一意になるので、直接参照として依存できます。\n\n## 新しいグローバルIDへの移行\n\n新しい ID 形式への移行を容易にするために、GraphQL API 要求で `X-Github-Next-Global-ID` ヘッダーを使用できます。 \n`X-Github-Next-Global-ID` ヘッダーの値は、`1` または `0` にすることができます。 値を `1` に設定すると、`id` フィールドを要求したオブジェクトに対して、常に新しい ID 形式が使用されるように応答ペイロードが強制されます。 値を `0` 設定すると、既定の動作に戻ります。この場合、オブジェクトの作成日に応じてレガシ ID または新しい ID が表示されます。\n\n`curl` コマンドを使った要求の例を次に示します。\n\n```shell\n$ curl \\\n  -H \"Authorization: Bearer $GITHUB_TOKEN\" \\\n  -H \"X-Github-Next-Global-ID: 1\" \\\n  https://api.github.com/graphql \\\n  -d '{ \"query\": \"{ node(id: \\\"MDQ6VXNlcjM0MDczMDM=\\\") { id } }\" }'\n```\n\nクエリでレガシ ID `MDQ6VXNlcjM0MDczMDM=` が使用された場合でも、応答には新しい ID 形式が含まれます。\n\n```json\n{\"data\":{\"node\":{\"id\":\"U_kgDOADP9xw\"}}}\n```\n\n`X-Github-Next-Global-ID` ヘッダーを使用すると、アプリケーションで参照するレガシ ID の新しい ID 形式を確認できます。 レスポンスで受信されたIDで、それらの参照を更新できます。 旧来のIDへの参照をすべて更新し、APIへのリクエストには新しいIDフォーマットを使用してください。\nバルク操作を行う際には、1つのAPIコールで複数ノードのクエリをサブミットするために、エイリアスを利用できます。 詳細については、[GraphQL ドキュメント](https://graphql.org/learn/queries/#aliases)を参照してください。\n\nアイテムのコレクションに対して新しいIDを取得することもできます。 たとえば、Organization中の最後の10個のリポジトリの新しいIDを取得したい場合は、以下のようなクエリを使うことができます。\n\n```graphql\n{\n  organization(login: \"github\") {\n    repositories(last: 10) {\n      edges {\n        cursor\n        node {\n          name\n          id\n        }\n      }\n    }\n  }\n}\n```\n\n`X-Github-Next-Global-ID` を `1` に設定すると、クエリ内のすべての `id` フィールドの戻り値に影響します。 つまり、`node` 以外のクエリを送信した場合でも、`id` フィールドを要求した場合は新しい形式の ID が返されます。\n\n## フィードバックを送る\n\nアプリに影響を与えるこの変更のロールアウトに関する懸念がある場合は、\n[GitHub サポート ポータル](https://support.github.com) にお問い合わせいただき、アプリ名などの情報を提供していただければ、より良いサポートを提供できます。"}