GraphQLとRESTfulの違い：詳細解説

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

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

## GraphQLとRESTful

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

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

## 解説：GraphQLとRESTfulとの違い

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

### レスポンスの形式

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

![https://apidog.com/jp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/5db630b5-e2ea-ba01-b41e-bcbaf0584e27.png)

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

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

![graph-api-example-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/f6b87a46-bffb-2630-64fe-a5d20e456269.png)

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

![graph-api-example-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/78185dae-fcaf-a4a6-68a6-5bafa9a2f4e4.png)

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

![graph-api-example-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/738fb16d-d0ac-86b0-c9e1-78131e53fdb5.png)

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](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)という包括的なプラットフォームは、RESTfulとGraphQLのAPIにも対応していますので、次のダウンロードボタンから、体験してみましょうか。

\:kissing_closed_eyes:
今回は以上になります！
最後まで見ていただきありがとうございました！
では、また次の記事で～！