UUUM攻殻機動隊(エンジニアブログ)

UUUMのエンジニアによる技術ブログです

GraphQLをはじめよう!

皆さんは普段、WEBでAPIを作っていますでしょうか? 最近はリッチなUIやスマートフォンアプリの開発が当たり前になってきたので、 APIを作ることが多いのではないでしょうか。

APIの開発を楽にするために、GraphQLを使ってみませんか?

現状のAPI開発の悩み

現在APIを作るときは、REST設計で開発を行うことが多いと思います。 実際開発中に以下のような悩みを持ったことはないでしょうか?

  • API多すぎ
  • 仕様がよく変わる
  • ドキュメントがメンテできない
  • もうRESTのAPI作るの飽きたよ…

そんなあなたにぜひGraphQLを! GraphQLを使えば楽しいAPI開発が待っているかも!

GraphQLって何?

答: A query language for your API. (出典: GraphQL )

以上です!(^o^)

……要するに、SQLみたいにクエリを書いて、サーバにリクエストして、 自分が欲しいデータを取って来たり、変更するということができるものです!

GitHub GraphQL API を試そう!

GraphQLがどういうものなのかを知るためには、GitHubが公開しているGraphQL APIを試してみるのがわかりやすいと思います。

そこで、GitHubのAPIを使ってGraphQLがどのようなものなのか試してみましょう!

GraphQL API Explorer | GitHub Developer Guide

上のURLにアクセスして、右上の Sign in With GitHub からログインしましょう。 ログインするとすぐに使用できるようになります。

f:id:m-suzukix:20190418192948p:plain

左上がクエリエディタになっていて、ここにサーバにリクエストするクエリを書いていきます。 右側は、サーバからのレスポンスが表示されます。

自分のアカウント情報を取得する

ではクエリエディタに下のものをコピーして貼り付けて、実行してみましょう!

  • クエリ
query {
  viewer {
    name
  }
}

実行は 再生ボタン みたいなのがあるので押すと実行されます。

f:id:m-suzukix:20190418192929p:plain

実行すると下の様なレスポンスが返ってくると思います。

  • レスポンス
{
  "data": {
    "viewer": {
      "name": "masa"
    }
  }
}

ここにさらに、アバターURLを取ってみましょう!

  • クエリ
query {
  viewer {
    name
    avatarUrl
  }
}
  • レスポンス
{
  "data": {
    "viewer": {
      "name": "masa",
      "avatarUrl": "https://avatars2.githubusercontent.com/u/47341025?v=4"
    }
  }
}

追加で登録してあるアバターのURLが取得できました!

このように自分が欲しい情報に合わせて、クエリを書くことでレスポンスを調整することができるのがGraphQLの特徴になります。 SQLのSELECT文をイメージしていただくと、わかりやすいのではないかと思います。

query とは?

ここで、先程からエディタに書いてたものは、どのような構造をしているのかを見ていきましょう。

まず query についてです。

query {
  viewer {
    name
  }
}

query はデータを取得するリクエストであることを示しています。 SQLではデータを取得する時に必ず SELECT を書くと思いますが、GraphQLでは必ず query を書くことになります。

この query の中には viewer という指定がありますが、 これは viewer というデータを返してくれというリクエストになります。

上の query をSQLで書くと下のような感じになります。

SELECT name FROM viewer

viewer の中身

viewer の中には nameavatarUrl など指定ができましたが、他にはどんなものが指定できるのか気になると思います。

これを調べるために、このAPIコンソールには便利なドキュメントビューワーが付属されています。

エディタの右端に Docs というボタンがあるので押すとドキュメントを見ることができます。

f:id:m-suzukix:20190418194312p:plain

開いたら、viewer を検索してみましょう!

f:id:m-suzukix:20190419114854p:plain

すると Query.viewer が出てくると思います。 これをクリックすると、詳細が見れます。

f:id:m-suzukix:20190419114914p:plain

認証中のユーザ情報が返ってくることがわかりました! その下に TYPEUser! というのがあるので、TYPEについて説明します。

Type

型の指定のことです。これはClassのようなものとイメージするとわかりやすいです。 ルールは以下のようになっています。

type 型名 {
  名前: 型
}

型を構成する Field を書くことができます。 先程の User! の中身を見てみましょう。

f:id:m-suzukix:20190419114936p:plain

FIELDS にどんなデータなのかの指定があります。 先程指定した name , avatarUrl だけ定義してみると下の形になります。

type User {
  name: String
  avatarUrl: URI!
}

後ろに ! があるのは NULL不許可 を示しています。 avatarUrl を指定すると必ず URI型 のデータが返ってきます。 URI型 もドキュメントからどんな型なのか見ることができます。URIの定義に則った文字列が返ってくることがわかると思います。

データを更新する

APIではデータを作成、更新、削除したりすることがありますが、 GraphQLではこれらは mutation で指定する形になります。

mutation {
  ここにどの操作を行うかを書く
}

リポジトリにスターを付けてみる

addStar というスキーマが用意されているので、これを使うとGitHubのリポジトリにスターを付けることができます。

まずドキュメントを使って仕様を確認してみましょう。

f:id:m-suzukix:20190419114952p:plain

Mutation.addStar が表示されます。

f:id:m-suzukix:20190419115002p:plain

ARGUMENTS に指定する引数が書かれています。 addStar には inputAddStarInput! が必須であるとわかります。 (AddStarInputの後ろに ! が付いているからです)

f:id:m-suzukix:20190419115012p:plain

AddStarInput の中身を見ていくと、starrableIdID型 で必須ということがわかります。 ID型 はGraphQLの組み込み型で、通常はbase64エンコードされた文字列が使われるようです。

このIDはリポジトリごとにユニークなものが振られています。 スターを付けるためには、このリポジトリのIDを取得する必要があります。

以下のクエリで取ってこれます。

query {
  viewer {
    repository(name: "pokemon") {
      id
    }
  }
}

このクエリは自分が所持しているリポジトリの名前が pokemon であるものを取得するものになります。

レスポンスは以下になります。

{
  "data": {
    "viewer": {
      "repository": {
        "id": "MDEwOlJlcG9zaXRvcnkxODAyNTUzNDk1="
      }
    }
  }
}

ここで取ってこれたIDを使います。 スターを更新する構文は以下になります。

mutation {
  addStar(input: { starrableId: "MDEwOlJlcG9zaXRvcnkxODAyNTUzNDk1=" }) {
    clientMutationId
  }
}

これを実行するとスターが付くかと思います! 仕様通りに addStar の引数に input: { starrableID: "ID" } の形式で指定を行っています。

GraphQLでは addStar のような構文でも 必ず返り値を指定する ことになっています。 しかし更新系のスキーマでは返り値が不要なこともあるかと思います。 そこで、clientMutationId という指定をすることで、NULL の返り値をレスポンスとして受け取ることができるようになっています。

このスキーマのレスポンスは以下の様になります。

{
  "data": {
    "addStar": {
      "clientMutationId": null
    }
  }
}

この他にも、スターを外したり、PullRequestにコメントを付けたりするスキーマなどが用意されています。 ドキュメントを調べて実際に使ってみると、GraphQLが何となくわかってくるかと思います。

実装するには

各プログラミング言語用のライブラリが用意されているので、これを使うことでGraphQLの実装を行うことができます。

Code | GraphQL

また、Applo EngineAWS AppSyn のようにGraphQLを使う環境が既に用意されていて、後はデータやスキーマを用意するだけで簡単に利用することができるサービスもあります。

まとめ

GitHubが公開しているGraphQLを使ったAPIのご紹介をしました。 GraphQLはまだまだWEB上で知見があまりなく、自分でGraphQLを作る時にどうやって実装して良いのか悩むことがあるかと思います。

そんな時には既に GitHubのAPIの仕様を参考にして開発してみるといい感じに実装ができるのではないかと思います!