観点 3 min read

GraphQL vs RESTful、その違いを解説

GraphQLとRESTfulとも、よく見られるAPIの形式になっています。本文では、レスポンスの形式、リクエストのルーディング、リクエストの処理といった3つの方面から、GraphQLとRESTfulとの違いを解説します。

GraphQLとRESTfulとの違い

GraphQLとRESTfulも、よく見られるAPIの形式になっています。

GraphQLとRESTful

GraphQLは、Facebookが開発したAPI(Application Programming Interface)のクエリ言語およびランタイム環境です。RESTful APIに代わる新しいAPIデザインアプローチとして注目されています。GraphQLは、様々なプログラミング言語で実装されています。また、さまざまな種類のデータベースや外部APIと統合できる柔軟なアーキテクチャを持っています。これにより、クライアント側のアプリケーションが必要なデータを簡単かつ効率的に取得できるようになります。

それに対して、RESTful APIは、Webアプリケーションの機能を外部のクライアントアプリケーションから利用するためのAPIの一種です。REST APIは、HTTPプロトコルを使用して通信を行い、一般的にJSONまたはXML形式でデータをやりとりします。リソース(データ)を一意の識別子(URI)で指定し、HTTPメソッド(GET、POST、PUT、DELETEなど)を使用してリソースを操作します。クライアントアプリケーションはHTTPリクエストを送信し、サーバーからのHTTPレスポンスを受け取ります。これにより、Webアプリケーションの機能を外部から利用することができます。

解説:GraphQLとRESTfulとの違い

本文では、レスポンスの形式、リクエストのルーディング、リクエストの処理といった3つの方面から、GraphQLとRESTfulとの違いを解説します。

レスポンスの形式

APIリクエストの核心内容はレスポンスで、つまり、リクエストサーバーから返されるデータの結果です。RESTfulの理念は、全てのレスポンスがURL(パスとパラメータを含む)によって取得されます。例えば、GETメソッドで相応のデータを取得することができます:GETリクエストを送信すると、レスポンスを取得できる(Apidogツールで例を示している):

ApidogのRESTful APIの実行例

上記の例から、レスポンスはリクエストとリンクされていることがわかりました。上記の例の本質は、実際に「リクエストのエンドポイント」になります。事前にレスポンスのデータ構造(Schema)を定義する必要があり、こうすると、リクエストを送信するときに、サーバーから返すデータを取得できるようになります。

GraphQLは、RESTfulに違っています。GraphQLでは、リクエストとSchemaの定義は別のところで行なっています。サーバーで複数のSchemaを定義することができますし、リクエストもサーバーの異なるSchemaを検索できます。上記と同じような例で、サーバー側でクエリのデータ構造(Schema)を定義した(APOLLOで例を示している):

サーバー側でクエリのデータ構造(Schema)を定義

Queryというデータ構造(Schema)をリクエストする場合、以下のようにサーバー側のSchemaの中にQuery型を作成する必要があります:

サーバー側のSchemaの中にQuery型を作成

それから、フロントエンドは、リクエストを送信できるようになります:

リクエストを送信

GraphQLとRESTfulともURLを通じてサーバーからのレスポンスを取得しますが、リクエストのリソースについて、明確な違いがあります。RESTfulでは、リソースの返すデータはサーバーによって事前に定義されます。その一方で、GraphQLでは、サーバーは利用可能なリソースのみを定義しますが、具体的に必要なリソースは、クライアントがフィールドを通じて決めています。

リクエストのルーディング

RESTful APIでは、リソースを操作するためにHTTPメソッドを使用します。これにより、リソースに対して特定のアクションを実行できます。例えば、GETメソッドはリソースの取得、POSTメソッドはリソースの作成、PUTメソッドはリソースの更新、DELETEメソッドはリソースの削除を示します。ルーティングは、URI(Uniform Resource Identifier)を使用して定義され、URIはAPIのエンドポイントを示します。

一方、GraphQL APIでは、単一のエンドポイントがあります。GraphQLでは、クライアントが必要なデータをリクエストし、サーバーが必要なデータのみを返します。クライアントは、GraphQLクエリを使用して、必要なデータの形式と量を指定します。GraphQLでは、データベースのスキーマに基づいてクエリを作成します。つまり、GraphQL APIのルーティングは、データベーススキーマに基づいて定義されます。

まとめてみると、RESTful APIは複数のエンドポイントを持ち、URIを使用してリソースにアクセスし、HTTPメソッドを使用してリソースを操作します。一方、GraphQL APIは単一のエンドポイントを持ち、GraphQLクエリを使用して必要なデータをリクエストし、スキーマに基づいてデータを返します。

リクエストの処理

RESTful APIでは、HTTPリクエストの種類に応じて、サーバーは異なる処理を実行します。例えば、GETリクエストを受け取った場合、サーバーはリソースを取得して返します。POSTリクエストを受け取った場合、サーバーはリソースを作成します。PUTリクエストを受け取った場合、サーバーは既存のリソースを更新します。DELETEリクエストを受け取った場合、サーバーはリソースを削除します。つまり、RESTful APIでは、HTTPメソッドを使用してリソースの操作を定義し、サーバーはそれに従ってリクエストを処理します。

一方、GraphQL APIでは、クライアントが必要なデータをクエリで指定し、サーバーは必要なデータのみを返します。GraphQLでは、クエリに含まれるフィールドのみが解決されます。このため、GraphQL APIでは、サーバーは必要なデータのみを処理し、不要なデータを返さないようにします。また、GraphQLはデータの変更を行うために、HTTPメソッドの代わりにMutationと呼ばれる操作を提供しています。

つまり、RESTful APIではHTTPメソッドに基づいてリクエストを処理し、リソースを操作します。一方、GraphQL APIでは、クライアントが必要なデータをクエリで指定し、サーバーは必要なデータのみを返すように処理します。また、GraphQL APIでは、データの変更を行うためにMutationを使用します。

まとめ

上記の内容をまとめてみると、GraphQLとRESTfulの主な相違点を以下にまとめます。

レスポンスの形式

  • RESTful: レスポンスはHTTPステータスコードとレスポンスボディで構成され、レスポンスボディはJSON、XML、HTMLなどの形式で返される。
  • GraphQL: レスポンスはGraphQLスキーマに基づいて構成され、JSON形式で返される。クライアントが必要なデータのみを指定するため、不要なデータが返されない。

リクエストのルーティング

  • RESTful: エンドポイント毎にリソースへのアクセス方法が異なるURIを使用してリクエストを処理する。
  • GraphQL: 単一のエンドポイントで、クライアントから必要なデータを取得するためにGraphQLクエリを使用する。

リクエストの処理

  • RESTful: HTTPメソッドを使用してリソースを操作するためのリクエストを処理する。例えば、GETメソッドはリソースの取得、POSTメソッドはリソースの作成、PUTメソッドはリソースの更新、DELETEメソッドはリソースの削除を示す。
  • GraphQL: クライアントから必要なデータのみを指定するためにGraphQLクエリを使用し、サーバーは必要なデータのみを返すように処理する。また、データの変更を行うためにMutationを使用する。

Apidogという包括的なプラットフォームは、RESTfulとGraphQLのAPIにも対応していますので、次のダウンロードボタンから、体験してみましょうか。

button

Apidogのニュースレターを購読する

今すぐ購読すると、いつでもApidogから更新情報と最新観点を手に入れることができます。