プログラマブル深海魚

目立たないけど華やかに

GraphQL APIについて

目次

GraphQLの概要

GraphQLはAPI用のクエリ言語であり、Facebookによって2012年に開発された後2015年にオープンソース化され、2018年にはGraphQL Foundationが設立されてGraphQLはGraphQL Foundationにより管理されるようになりました。
GraphQLでは、APIでクエリ可能な型やフィールドをスキーマとして定義し、またAPIを利用するクライアントは取得するフィールドを指定することができます。そのため、複雑で階層的なデータ構造を持つAPIの設計に適しています。

リクエスト操作の種類

GraphQL APIにリクエストする際の操作は、以下の3種類があります。

  • クエリ: データ取得操作
  • ミューテーション: データ更新操作
  • サブスクリプション: リアルタイム更新通知

RESTful APIとの比較

  • GraphQL APIでは、エンドポイントが1つだけになります。
  • GraphQL APIは、必要なデータのみを指定して取得することができるため、その点において効率的です。
  • RESTful APIではデータ構造を変更する場合はバージョンを変更したりエンドポイントを追加したりする必要がありますが、GraphQL APIではフィールド追加等で対応できる場合が多くなります。そのため、バージョン管理の必要性が少なくなります。
  • GraphQL APIはRESTful APIに比べて、一般的に実装が複雑になります。
  • GraphQL APIでは、キャッシュの利用が複雑になります。

スキーマの定義

GraphQLのスキーマは、スキーマ定義言語によって定義されます。

例えば、以下のように型を定義します。

type User {
  id: Int!
  name: String!
  age: Int!
  address: String
}

また、クエリやミューテーションを定義できます。

type Query {
  user(id: Int!): User
}

type Mutation {
  createUser(user: User): User
}

クエリ・ミューテーションの利用

クエリでは、取得するフィールドを指定してリクエストすることができます。

例えば、以下のリクエストを送信すると

query {
  user(id: 1) {
    id
    name
  }
}

以下のように指定したフィールドだけがレスポンスされます。

{
  "id": 1,
  "name": "Mano Sakuragi"
}

ミューテーションでは、データを登録・更新することができます。ここでも、戻り値のフィールドを指定することができます。

例えば、以下のリクエストを送信すると

mutation {
  createUser(user: {
    name: "Hiori Kazano",
    age: 15
  }) {
    id
    name
  }
}

以下のようにレスポンスが返ってきます。

{
  "id": 2,
  "name": "Hiori Kazano"
}

ScalaでGraphQLを実装する場合に利用できるライブラリ

以下のようなライブラリを利用できそうです。

  • Sangria
  • Caliban

参考文献

Introduction to GraphQL | GraphQL
https://graphql.org/learn/

初心者向けガイド:GraphQLの基本情報
https://apidog.com/jp/blog/basis-of-graphql/

GraphQL とは?をわかりやすく解説
https://www.redhat.com/ja/topics/api/what-is-graphql

GraphQL vs REST: What's the Difference? | IBM
https://www.ibm.com/think/topics/graphql-vs-rest-api

GraphQLスキーマの解説|NestJS でGraphQL開発を試す
https://zenn.dev/keisuke333/books/ce5e3208a9d393/viewer/f5bd3f

[Scala]Sangriaを使ってGraphQL APIを実装する #sangria - Qiita
https://qiita.com/petitviolet/items/e3e87c3f3e740b3c57ba

Scala, Akka HTTP, CalibanでGraphQL APIを実装する
https://zenn.dev/kowaremonoid/articles/4faaec0356877a