RESTful APIはモデルごとにパスを作成し、IDをつけてCRUDなデータの操作を行えるようにしています。これはとても分かりやすい反面、クライアント側ではレスポンス形式を指定できないという欠点があります。
場合によって欲しいデータが異なる際には ?include=friends
のようなパラメータをつけたり、別なAPIを追加したりして対応します。こうした拡張はRESTful APIに比べると打算的で、あまり良い設計になっていないことが殆どです。
そうした問題を解決できるかも知れないのがFacebookの開発しているGraphQLというクエリ言語です。RESTful APIではありませんが、こうしたインタフェースを用意しておくのも使い勝手が良さそうです。
GraphQLとは
GraphQLはHTTPを使ったクエリ言語と言えます。例えばユーザIDが1の名前を取得する場合は次のようにクエリを投げます。
{ user(id: "1") { name } }
そうすると結果が次のように返ってきます。
{ "data": { "user": { "name": "Dan" } } }
GraphQLを受け付けるエンドポイントは /graphql
のように一つになっているのが望ましいようです。JSONでクエリを投げて、JSONで結果を返すようになっています。
バックエンドについて
バックエンドのデータベースは任意のものが選択できます。MySQL/PostgreSQL/SQLiteなどが選択できます。実装はNode.jsで行われているものが多いようです。
データの更新について
GraphQLはデータのクエリだけでなく、データの更新や削除にも対応しています。その際にはMutationという定義を使います。
mutation { addComment( postId: 42, authorEmail: "mark@fb.com", markdown: "GraphQL is clearly a **game changer***" ) { id, formattedBody, timestamp } }
データ型を定義する
GraphQLではクエリを実行した際にあらかじめ定義したデータ型に当てはめることができます。
type Droid : Character { id: String! name: String friends: [Character] appearsIn: [Episode] secretBackstory: String primaryFunction: String }
このようなJSON風の言語を使って定義することで入力値の検証を行ったり、データにメソッドを追加したりすることができます。
GraphQLはクライアント側から欲しいデータを指定したり、データの更新を指示します。サーバ側の実装が減る一方で、クライアント側でロジックを実装する必要があるかも知れません。バランスを考える必要があるでしょう。
RESTfulではできなかった、より細かくデータを指定して取得するということがGraphQLを使うことで実現します。セキュリティ要件などは個別に実装していくことになりますが、技術的に面白いアプローチではないでしょうか。