ログイン / 登録 アカウント

API

GraphQL とは

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語とサーバーサイドランタイムの両方を指します。クライアントがリクエストしたデータだけを提供することを優先します。 

GraphQL は、API の速度、柔軟性、開発者にとっての使いやすさを向上させるために設計されました。GraphiQL と呼ばれる統合開発環境 (IDE) にデプロイすることもできます。GraphQL は REST の代わりに、データを複数のデータソースから取得するリクエストを 1 つの API 呼び出しで構成できます。 

さらに、GraphQL によって、既存のクエリに影響を与えずに、フィールドの追加または廃止を柔軟に保守できます。開発者は API をどんな方法で構築しても構いません。構築された API は GraphQL の仕様によって、クライアントに予測可能な方法で動作します。

スキーマ、リゾルバー、およびその他の一般的な GraphQL の用語

API 開発者は GraphQL を使用してスキーマを作成し、クライアントがこのサービスを通じてクエリできるすべてのデータを記述します。 

GraphQL スキーマはオブジェクトタイプで構成され、どの種類のオブジェクトをリクエストでき、どのフィールドを指定できるかを定義します。 

クエリを受け取ると、GraphQL はクエリをスキーマに照合して検証し、検証されたクエリを実行します。

API 開発者は、スキーマの各フィールドにリゾルバーという関数を割り当てます。実行中にリゾルバーが呼び出されて値を生成します。

イメージ

API クエリ (概要は graphql-spec リポジトリ) の構文の定義と検証を除き、その他のほとんどを API 設計者が決定できます。GraphQL は、データの保管方法や使用するプログラミング言語について、一切指定しません。開発者は PHP (graphql-php)、Scala (Sangria)、Python (Graphene Python)、Ruby (graphql-ruby)、JavaScript (graphql.js) などを使用できます。GraphQL にはネットワーク、認証、ページングに関する要件はありません。

クライアントからの観点から、最もよく利用される GraphQL の操作はクエリミューテーションです。これらを create (作成)、read (読み取り)、update (更新)、delete (削除) (CRUD) モデルに照らして考えると、クエリは read (読み取り) に相当します。その他すべて (create、update、delete) はミューテーションによって処理されます。

企業環境における GraphQL の長所と短所

GraphQL をビジネス環境やエンタープライズ環境で試してみようという場合は、その長所と短所を検討してください。

メリット

  • GraphQL スキーマは GraphQL アプリケーションに単一のソースを設定します。組織には API 全体をフェデレーションする方法が提供されます。
  • GraphQL 呼び出しは 1 回のラウンドトリップで処理されます。クライアントはリクエストしたものを取得し、余分なものは取得されません。
  • データ型はしっかり定義されているので、クライアントとサーバー間の食い違いが減少します。 
  • GraphQL はイントロスペクションが可能で、クライアントは、利用できるデータ型のリストをリクエストできます。これは自動生成文書に最適です。
  • GraphQL では、既存のクエリを壊さずにアプリケーション API を進化させることができます。
  • 多数のオープンソース GraphQL 拡張機能が利用可能で、REST API にはない機能を提供しています。
  • GraphQL は特定のアプリケーション・アーキテクチャにとらわれません。既存の REST API 上に導入して、既存の API 管理ツールと連携できます。

デメリット

  • REST API に慣れている開発者の場合、GraphQL を学習する期間が必要になります。
  • GraphQL ではデータクエリ処理の多くがサーバーサイドに移行されるので、サーバー開発者の作業が複雑になります。
  • 実装方法によっては、REST API とは異なる API 管理戦略が必要になります (特に、レート制限や価格設定を考慮する場合)。
  • キャッシュが REST よりも複雑になります。
  • API 保守担当者には、保守可能な GraphQL スキーマを作成する作業が付加されます。

GraphQL クエリのサンプル

GraphQL を理解するには、クエリと応答の例をいくつか見るのが最適です。GraphQL プロジェクト Web サイトである graphql.org の例を編集した、3 つのサンプルをご覧ください。

最初のサンプルでは、クライアントが GraphQL クエリを構築し、指定した形式で特定のフィールドを返すように API に要求しています。

{ me { name } }

GraphQL API から、次のような結果が JSON 形式で返されます。

{ "me": { "name": "Dorothy" } }

次のサンプルに示すように、クライアントは GraphQL クエリの一部として引数を渡すこともできます。

{ human(id: "1000") { name location } }

次のような結果になります。

{ "data": { "human": { "name": "Dorothy, "location": "Kansas" } } }

ここからが、GraphQL の興味深い部分です。GraphQL では、ユーザーは再利用可能なフラグメントを定義して変数を割り当てることができます。

ID のリストをリクエストしてから、各 ID に対する一連のレコードをリクエストする必要があるとします。GraphQL なら、必要なすべてを 1 つの API 呼び出しで取得するクエリを構築できます。 

クエリは次のようになります。

query HeroComparison($first: Int = 3) { leftComparison: hero(location: KANSAS) { ...comparisonFields } rightComparison: hero(location: OZ) { ...comparisonFields } } fragment comparisonFields on Character { name friendsConnection(first: $first) { totalCount edges { node { name } } } }


次のような結果になります。

{ "data": { "leftComparison": { "name": "Dorothy", "friendsConnection": { "totalCount": 4, "edges": [ { "node": { "name": "Aunt Em" } }, { "node": { "name": "Uncle Henry" } }, { "node": { "name": "Toto" } } ] } }, "rightComparison": { "name": "Wizard", "friendsConnection": { "totalCount": 3, "edges": [ { "node": { "name": "Scarecrow" } }, { "node": { "name": "Tin Man" } }, { "node": { "name": "Lion" } } ] } } } } 

GitHub ユーザーは、GitHub の GraphQL Explorer で GraphQL の実践的な処理を簡単に体験できます。

GraphQL とオープンソース

GraphQL は Facebook が開発したもので、2012 年にモバイルアプリケーション向けに使用が開始されました。GraphQL 仕様は 2015 年にオープンソース化されました。今では、GraphQL Foundation が管理しています。

GraphQL を活用しているオープンソース・プロジェクトは多岐にわたります。GraphQL の採用を促進するためのプロジェクトの一部を以下に示します。

  • Apollo:フロントエンド・クライアント・ライブラリ (Apollo Client) とバックエンド・サーバー・フレームワーク (Apollo Server) を含む GraphQL プラットフォーム
  • Offix:アプリケーションに到達できない場合でも GraphQL ミューテーションとクエリを実行可能にする、オフラインクライアント
  • Graphback:GraphQL 対応 Node.js サーバーを生成する、コマンドラインクライアント
  • OpenAPI-to-GraphQL:OpenAPI 仕様で規定される API または Swagger を GraphQL に変換する、コマンドラインインタフェースとライブラリ

Red Hat の API 製品を調べる

Red Hat 3scale API Management

API 管理プラットフォーム。

Red Hat Fuse logo

分散インテグレーション・プラットフォーム。