アカウント ログイン
Jump to section

GraphQL とは

URL をコピー

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

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

さらに、GraphQL によって、既存のクエリに影響を与えずに、フィールドの追加または廃止を柔軟に保守できます。開発者は API をどんな方法で構築しても構いません。構築された API は 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) はミューテーションによって処理されます。

無料トライアル

Red Hat OpenShift API Management を試す

60 日間セルフサービスで、フルマネージドの API サービスのメリットを体験できます。

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 は 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 に変換する、コマンドラインインタフェースとライブラリ

関連資料

記事

API とは

API はアプリケーション・プログラミング・インタフェースの略であり、アプリケーション・ソフトウェアを構築および統合するための一連の定義とプロトコルです。

記事

API ゲートウェイの機能

API ゲートウェイは、クライアントとバックエンドサービスのコレクションの間に位置するアプリケーション・プログラミング・インタフェース (API) 管理ツールです。

記事

API 管理に Red Hat を選ぶ理由

Red Hat の API ソリューションは、再利用性や IT のアジリティに加え、測定、監視、スケーリングを支援する管理インタフェースにフォーカスしており、自在に拡張させることができます。

API の詳細はこちら

製品

Red Hat 3scale API Management

アプリケーション・プログラミング・インタフェース (API) の共有、配布、制御、収益化のためのインフラストラクチャ・プラットフォーム。

リソース

e ブック

アジャイル・インテグレーション:エンタープライズ・アーキテクチャのブループリント

チェックリスト

エグゼクティブ・チェックリスト:オープンバンキング

Illustration - mail

その他の関連コンテンツ

無料のニュースレター「Red Hat Shares」(英語) では、注目の IT トピックスに関するコンテンツをお届けしています。