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ツールで例を示している):
上記の例から、レスポンスはリクエストとリンクされていることがわかりました。上記の例の本質は、実際に「リクエストのエンドポイント」になります。事前にレスポンスのデータ構造(Schema)を定義する必要があり、こうすると、リクエストを送信するときに、サーバーから返すデータを取得できるようになります。
GraphQLは、RESTfulに違っています。GraphQLでは、リクエストとSchemaの定義は別のところで行なっています。サーバーで複数のSchemaを定義することができますし、リクエストもサーバーの異なるSchemaを検索できます。上記と同じような例で、サーバー側でクエリのデータ構造(Schema)を定義した(APOLLOで例を示している):
Queryというデータ構造(Schema)をリクエストする場合、以下のようにサーバー側の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にも対応していますので、次のダウンロードボタンから、体験してみましょうか。